Beautiful Arrangement
Problem
Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these N numbers successfully if one of the following is true for the ith position (1 <= i <= N) in this array:
The number at the ith position is divisible by i. i is divisible by the number at the ith position. Now given N, how many beautiful arrangements can you construct?
Example 1:
Input: 2
Output: 2
Explanation:
The first beautiful arrangement is [1, 2]:
Number at the 1st position (i=1) is 1, and 1 is divisible by i (i=1).
Number at the 2nd position (i=2) is 2, and 2 is divisible by i (i=2).
The second beautiful arrangement is [2, 1]:
Number at the 1st position (i=1) is 2, and 2 is divisible by i (i=1).
Number at the 2nd position (i=2) is 1, and i (i=2) is divisible by 1.
Note:
N is a positive integer and will not exceed 15.
Solution
Backtracking:
public class Solution {
int res = 0;
public int countArrangement(int n) {
if (n <= 0) return 0;
helper(new boolean[n + 1], n, 1);
return res;
}
private void helper(boolean[] visited, int n, int cur) {
if (cur > n) {
res++;
return;
}
for (int i = 1; i <= n; i++) {
if (!visited[i] && (cur % i == 0 || i % cur == 0)) {
visited[i] = true;
helper(visited, n, cur + 1);
visited[i] = false;
}
}
}
}
Analysis
This problem is about using permutations from 1
n
and get the qualified result
We have boolean[] visited
to mark whether the current number is visited
If so and it's divisible, we mark it visited
and then call helper()
method with cur + 1
Because of backtracking, we mark it visited[i] = false
at the end