C++回溯算法中子集問題分析探討

一、子集
子集問題與其它問題最大的不同就是:每次遞歸,不止考慮葉子節(jié)點,而是考慮所有節(jié)點!
體現(xiàn)在代碼上,就是每次遞歸都先result.push_back(path);
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums,int index){
result.push_back(path);
if(index>=nums.size())
return;
for(int i=index;i<nums.size();i++){
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};二、子集II
本題與上題唯一的區(qū)別在于:輸入樣例有重復(fù)數(shù)字,但又要求結(jié)果不能重復(fù)
本題與組合總和II是一個套路,即:橫向遍歷不可重復(fù),縱向遍歷可重復(fù)
體現(xiàn)在代碼上,就是if(i>index&&nums[i]==nums[i-1]) continue;
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums,int index){
result.push_back(path);
if(index>=nums.size()) return;
for(int i=index;i<nums.size();i++){
if(i>index&&nums[i]==nums[i-1])
continue;
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
backtracking(nums,0);
return result;
}
};三、遞增子序列
這題嚴(yán)格來說并不是子集問題,但是有一點希望和子集II對比一下,就是同一層元素不能重復(fù)的問題,這一題因為元素不能排序,所以在判斷元素是否重復(fù)的問題上,并不能采用類似于上一題的if(i>index&&nums[i]==nums[i-1]) continue;方法,而是應(yīng)該開辟一個used數(shù)組記錄每一層元素是否已出現(xiàn)過,其實上一題也能用這種方法,不過上一題沒這個必要
還要注意used數(shù)組開辟的位置是在backtracking函數(shù)內(nèi)部,意思很明顯:used數(shù)組只管記錄本層元素,至于下一層元素,則要開辟新的ued數(shù)組來記錄
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums,int index){
if(path.size()>1){
result.push_back(path);
if(index==nums.size()) return;
}
int used[201]={0};//記錄本層元素是否重復(fù)使用,新的一層都會重新定義
for(int i=index;i<nums.size();i++){
if(used[nums[i]+100]==1||(!path.empty()&&nums[i]<path.back()))
continue;
used[nums[i]+100]=1;
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};到此這篇關(guān)于C++回溯算法中子集問題分析探討的文章就介紹到這了,更多相關(guān)C++回溯算法子集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C語言實現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語言實現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
最新C/C++中的new和delete的實現(xiàn)過程小結(jié)
這篇文章主要介紹了C/C++中的new和delete的實現(xiàn)過程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
C語言關(guān)鍵字auto與register及static專項詳解
這篇文章主要解釋了c語言中什么是數(shù)據(jù)類型,什么是變量,他們的真正含義是什么。分析了屬性關(guān)鍵字auto,register和static的用法2022-07-07
C++修煉之構(gòu)造函數(shù)與析構(gòu)函數(shù)
本章節(jié)我們將學(xué)習(xí)類的6個默認(rèn)成員函數(shù)中的構(gòu)造函數(shù)與析構(gòu)函數(shù),并對比C語言階段的內(nèi)容來學(xué)習(xí)它們的各自的特性,感興趣的同學(xué)可以參考閱讀2023-03-03

