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 byi
.i
is divisible byperm[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