0526. Beautiful Arrangement
https://leetcode.com/problems/beautiful-arrangement
Description
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
ac
class Solution {
int res = 0;
boolean[] visiting;
public int countArrangement(int N) {
// edge cases
visiting = new boolean[N+1];
backtrack(1, N);
return res;
}
private void backtrack(int kth, int n) {
// exit
if (kth == n + 1) {
res++;
return;
}
for (int i = 1; i <= n; i++) {
if (visiting[i]) continue;
if (i % kth == 0 || kth % i == 0) {
visiting[i] = true;
backtrack(kth+1, n);
visiting[i] = false;
}
}
}
}
same code, slight change. starting from backward accelerate the process because it avoids entering wrong path in earlier stage.
class Solution {
int res = 0;
boolean[] visiting;
public int countArrangement(int N) {
// edge cases
visiting = new boolean[N+1];
backtrack(N, N);
return res;
}
private void backtrack(int kth, int n) {
// exit
if (kth == 0) {
res++;
return;
}
for (int i = 1; i <= n; i++) {
if (visiting[i]) continue;
if (i % kth == 0 || kth % i == 0) {
visiting[i] = true;
backtrack(kth-1, n);
visiting[i] = false;
}
}
}
}
Last updated
Was this helpful?