LeetCode 526. Beautiful Arrangement

原题链接在这里:https://leetcode.com/problems/beautiful-arrangement/

题目:

Suppose you have n integers labeled 1 through n. A permutation of those n integers perm (1-indexed) is considered a beautiful arrangement if for every i (1 <= i <= n), either of the following is true:

  • perm[i] is divisible by i.
  • i is divisible by perm[i].

Given an integer n, return the number of the beautiful arrangements that you can construct.

Example 1:

Input: n = 2
Output: 2
Explanation: 
The first beautiful arrangement is [1,2]:
    - perm[1] = 1 is divisible by i = 1
    - perm[2] = 2 is divisible by i = 2
The second beautiful arrangement is [2,1]:
    - perm[1] = 2 is divisible by i = 1
    - i = 2 is divisible by perm[2] = 1

Example 2:

Input: n = 1
Output: 1 

Constraints:

  • 1 <= n <= 15

题解:

典型的backtracking. 用visited记录用过的位置, 挨个position往后permute. 遇到不合规矩的直接返回, 看能不能走到N.

Time Complexity: exponential. 每次走到最后才遇到不和规矩的backtrack回来.

Space: O(N).

AC Java:

 1 class Solution {
 2     int res = 0;
 3     public int countArrangement(int N) {
 4         if(N <= 0){
 5             return 0;
 6         }
 7         
 8         boolean [] visited = new boolean[N+1];
 9         dfs(visited, 1, N);
10         return res;
11     }
12     
13     private void dfs(boolean [] visited, int pos, int N){
14         if(pos > N){
15             res++;
16             return;
17         }
18         
19         for(int i = 1; i<=N; i++){
20             if(!visited[i] && (i%pos==0 || pos%i==0)){
21                 visited[i] = true;
22                 dfs(visited, pos+1, N);
23                 visited[i] = false;
24             }
25         }
26     }
27 }

AC Python:

 1 class Solution:
 2     def countArrangement(self, n: int) -> int:
 3         if n < 0:
 4             return 0
 5         
 6         self.res = 0
 7         self.dfs(n, [False] * (n + 1), 1)
 8         return self.res
 9     
10     def dfs(self, n: int, visited: List[bool], pos: int) -> None:
11         if pos > n:
12             self.res += 1
13             return
14         
15         for i in range(1, n + 1):
16             if not visited[i] and (i % pos == 0 or pos % i == 0):
17                 visited[i] = True
18                 self.dfs(n, visited, pos + 1)
19                 visited[i] = False

跟上Beautiful Arrangement II.

posted @ 2017-10-04 02:40  Dylan_Java_NYC  阅读(389)  评论(0编辑  收藏  举报