一,問題描述
二,問題分析
經典回溯問題
回溯的核心是遞歸和返回
三,代碼解答
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;
}
};