leetcode 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:
- 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.
基本题:回溯法。
解法一:开辟一个新的数组,标记是否访问过。
1 class Solution { 2 int cnt = 0; 3 public: 4 int countArrangement(int N) { 5 vector<bool> visited(N + 1, false); 6 calculate(N, visited, 1); 7 return cnt; 8 } 9 void calculate(int N, vector<bool> &visited, int pos) { 10 if (pos > N) { 11 cnt++; 12 return; 13 } 14 for (int i = 1; i <= N; ++i) { 15 if (!visited[i] && ((pos % i == 0) || (i % pos == 0))) { 16 visited[i] = true; 17 calculate(N, visited, pos + 1); 18 visited[i] = false; 19 } 20 } 21 } 22 };
解法二:
越努力,越幸运