算法實踐:leetcode526 優美的排列

leetcode526 優美的排列

描述

假設有從 1 到 N 的 N 個整數,如果從這 N 個數字中成功構造出一個數組,使得數組的第 i 位 (1 <= i <= N) 滿足如下兩個條件中的一個,我們就稱這個數組爲一個優美的排列。條件:

  1. i 位的數字能被 i 整除
  2. 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 整除

說明:

  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;
            }
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章