給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: [1,2,2]
輸出:[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
]
和演算法-回溯/位運算-求子集類似,只不過需要剔除相同的組合。
class
solution
arrays.
sort
(nums)
;backtrack
(nums, resultlist,
newarraylist
(),0);
return resultlist;
}private
void
backtrack
(int
nums, list
> resultlist, arraylist
prevlist,
int start)
if(prevlist.
size()
== nums.length)
for(
int j = start; j < nums.length; j++)}
}
o(n * 2^n)
實際體驗超級慢
o(n * 2^n)
上面的回溯法執行耗時16ms,超級慢。
看了下**,執行resultlist.contains(prevlist)
的時候需要遍歷resultlist
中的所有子list,然後挨個遍歷子list和本prevlist所有元素是否相同。。。這也太慢了。
想想,怎麼去重?那就是backtract遍歷的時候如果和該次遍歷**現過的元素相同就不
class
solution
// 這裡必須排序,否則可能造成 這樣的重複組合
arrays.
sort
(nums)
;backtrack
(nums, resultlist,
newarraylist
(),0);
return resultlist;
}private
void
backtrack
(int
nums, list
> resultlist, arraylist
prevlist,
int start)
if(prevlist.
size()
== nums.length)
for(
int j = start; j < nums.length; j++
) prevlist.
add(nums[j]);
backtrack
(nums, resultlist, prevlist, j +1)
; prevlist.
remove
(prevlist.
size()
-1);}}}
o(n * 2^n)
這次快多了
回溯 含有相同元素求子集
90.subsets ii medium for example,if nums 1,2,2 a solution is 2 1 1,2,2 2,2 1,2 題目描述 給定乙個集合,集合中有重複元素,返回其所有的不重複子集。思路分析 求集合的子集,用回溯法進行解決。由於有重複元素,那麼我們先對集合進...
子集 回溯演算法
採用回溯演算法,每個數有兩種情況,選中或不選中 class solution void dfs vector nums,int len 將當前數新增到path中 代表選中該數 path.push back nums len dfs nums,len 1 將該數去掉 代表不選中該數 path.pop ...
回溯法 重複元素集合 求子集
問題 給定乙個可能具有重複數字的列表,返回其所有可能的子集。樣例 1 輸入 0 輸出 0 樣例 2 輸入 1,2,2 輸出 2 1 1,2,2 2,2 1,2 思路 使用回溯法的遞迴框架 解空間為子集樹 對於集合 現了重複的數字,需要設計剪枝函式check i 規定重複元素的選取狀態只能是前半部分1...