# 526. Beautiful Arrangement

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:

1. The number at the ith position is divisible by i.
2. 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:

1. N is a positive integer and will not exceed 15.

``````class Solution {
public:
int countArrangement(int N) {
int res = 0;
vector<int> visited(N + 1, 0);
helper(N, visited, 1, res);
return res;
}
void helper(int N, vector<int>& visited, int pos, int& res) {
if (pos > N) {
++res;
return;
}
for (int i = 1; i <= N; ++i) {
if (visited[i] == 0 && (i % pos == 0 || pos % i == 0)) {
visited[i] = 1;
helper(N, visited, pos + 1, res);
visited[i] = 0;
}
}
}
};
``````

1 2 3 4
1 4 3 2
2 1 3 4
2 4 3 1
3 2 1 4
3 4 1 2
4 1 3 2
4 2 3 1

``````class Solution {
public:
int countArrangement(int N) {
vector<int> nums(N);
for (int i = 0; i < N; ++i) nums[i] = i + 1;
return helper(N, nums);
}
int helper(int n, vector<int>& nums) {
if (n <= 0) return 1;
int res = 0;
for (int i = 0; i < n; ++i) {
if (n % nums[i] == 0 || nums[i] % n == 0) {
swap(nums[i], nums[n - 1]);
res += helper(n - 1, nums);
swap(nums[i], nums[n - 1]);
}
}
return res;
}
};
``````

2 4 3 1
4 2 3 1
3 4 1 2
4 1 3 2
1 4 3 2
3 2 1 4
2 1 3 4
1 2 3 4

https://discuss.leetcode.com/topic/79916/java-solution-backtracking

https://discuss.leetcode.com/topic/79921/my-c-elegant-solution-with-back-tracking

 微信打赏 Venmo 打赏
（欢迎加入博主的知识星球，博主将及时答疑解惑，并分享刷题经验与总结，试运营期间前五十位可享受半价优惠～）

×

Help us with donation