C++回溯算法中的全排列問題分析探討

一、全排列
全排列的特點就是:解放了index(每次遍歷都從0開始),但是解放index的同時,又捆綁了used數(shù)組,記錄已經(jīng)出現(xiàn)過的元素
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
int used[7]={0};
void backtracking(vector<int>& nums){
if(path.size()==nums.size()){
result.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
if(used[i]==1)
continue;
path.push_back(nums[i]);
used[i]=1;
backtracking(nums);
used[i]=0;
path.pop_back();
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
backtracking(nums);
return result;
}
};二、全排列II
本題與全排列唯一不同在于需要去重這題與上一題唯一區(qū)別在于輸入樣例為可重復(fù)序列,且要求輸出樣例不重復(fù)
對于全排列問題,模板是設(shè)置used數(shù)組,只有used[i]==0時,才能選擇該元素
對于去重問題,模板是先對nums排序,再判斷nums[i]與nums[i-1]是否相等
根據(jù)全排列問題模板,設(shè)置used數(shù)組,只有used[i]==0時才可以選擇
根據(jù)去重模板,先對nums排序,再判斷nums[i]與nums[i-1]是否相等
但是全排列的去重沒那么簡單,因為全排列i是從0開始遍歷,因此還要記錄同一層當(dāng)前已經(jīng)訪問到哪兒了,同一層不可以重復(fù),但是同一樹枝可以重復(fù)
但是不必再設(shè)置index,因為used數(shù)組可以兼任這個功能
如果used[i-1]==1,說明在同一個樹枝訪問過nums[i-1],同一樹枝可以重復(fù)
如果used[i-1]==0,說明在同一層訪問過nums[i-1],同一層不可以重復(fù)
很繞~
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
int used[9]={0};
void backtracking(vector<int>& nums){
if(path.size()==nums.size()){
result.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0)
continue;
if(used[i]==0){
path.push_back(nums[i]);
used[i]=1;
backtracking(nums);
used[i]=0;
path.pop_back();
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
backtracking(nums);
return result;
}
};到此這篇關(guān)于C++回溯算法中的全排列問題分析探討的文章就介紹到這了,更多相關(guān)C++回溯算法全排列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實例講解C++設(shè)計模式編程中State狀態(tài)模式的運用場景

