LeetCode 46 全排列

一,問題描述

二,問題分析

經典回溯問題

 回溯的核心是遞歸和返回

三,代碼解答

class Solution {
private:
vector<vector<int>> res;    //保存符合條件的排列數組
vector<int> used;           //用於記錄數字是否被使用
//表示從數組nums中每次選擇一位沒有使用過的數字存入數組c中,直到所有數字被選擇完,表示到達遞歸邊界
void dfs(vector<int>& nums,vector<int>& c,int index){
    //回溯的邊界條件
    if(index == nums.size()){
        res.push_back(c);
        return;
    }
    //遞歸過程
    for(int i=0;i<nums.size();i++){
        if(used[i]==false)      //說明nums[i]未被使用
        {
            c.push_back(nums[i]);       //nums[i]存入c中
            used[i] = true;             //並標記爲使用
            dfs(nums,c,index+1);
            c.pop_back();               //依次退出c中的元素
            used[i] = false;
        }
    }
    return;
}
public:
    vector<vector<int>> permute(vector<int>& nums) {
        int n = nums.size();
        used = vector<int>(n,false);
        vector<int> c;
        dfs(nums,c,0);
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章