演算法 回溯 求子集2

2021-10-05 10:04:02 字數 1759 閱讀 4936

給定乙個可能包含重複元素的整數陣列 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...