leetcode526 優美的排列
描述
假設有從 1 到 N 的 N 個整數,如果從這 N 個數字中成功構造出一個數組,使得數組的第 i 位 (1 <= i <= N) 滿足如下兩個條件中的一個,我們就稱這個數組爲一個優美的排列。條件:
- 第 i 位的數字能被 i 整除
- i 能被第 i 位上的數字整除
現在給定一個整數 N,請問可以構造多少個優美的排列?
示例:
輸入: 2
輸出: 2
解釋:
第 1 個優美的排列是 [1, 2]:
第 1 個位置(i=1)上的數字是1,1能被 i(i=1)整除
第 2 個位置(i=2)上的數字是2,2能被 i(i=2)整除
第 2 個優美的排列是 [2, 1]:
第 1 個位置(i=1)上的數字是2,2能被 i(i=1)整除
第 2 個位置(i=2)上的數字是1,i(i=2)能被 1 整除
說明:
- N 是一個正整數,並且不會超過15。
代碼
回溯算法,套用模板
result = []
def backtrack(路徑, 選擇列表):
if 滿足結束條件:
result.add(路徑)
return
for 選擇 in 選擇列表:
做選擇
backtrack(路徑, 選擇列表)
撤銷選擇
class Solution {
public:
int Num;
int res = 0;
int countArrangement(int N) {
Num = N;
int B[N+1];
bool visited[N+1];
memset(B,0,sizeof(B));
memset(visited,false,sizeof(visited));
Bactrace(B,visited,1);
return res;
}
void Bactrace(int* B,bool* visited,int cell){
if(cell>Num){
res++;
return;
}
for(int i=1;i<=Num;i++){
if(!visited[i]){
B[cell] = i;
visited[i] = true;
if(B[cell]%cell==0 || cell%B[cell]==0){
Bactrace(B,visited,cell+1);
}
B[cell] = 0;
visited[i] = false;
}
}
}
};