給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
輸入: [1,2,2]
輸出:[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
]和78類似。但是對於有重複元素的陣列:
要先進行排序。
要進行判重。begin代表的是第幾層,i代表的是當前層的第幾個數字。【1 2(第乙個2) 5】中的2是第begin層的第i=begin個數字。【1 2 (第二個2)5】是第begin層的第i+1>begin個數字。當出現i > begin && candidates[i] == candidates[i - 1] 的時候,表明遍歷到了同一層的不同的數字。那麼屬於不同位置重複數字的情況。
在進入下一層迴圈的時候begin要加1避免重複使用自身。
public list
>
subsetswithdup
(int
nums)
arrays.
sort
(nums)
;int len = nums.length;
list
list =
newarraylist
<
>()
;dfs
(nums,
0,list,len,res)
;return res;
}public
void
dfs(
int[
]nums,
int begin,list
list,
int len,list
> res)
list.
add(nums[i]);
dfs(nums,i+
1,list,len,res)
; list.
remove
(list.
size()
-1);
}}
演算法 回溯 求子集2
給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 1,2,2 輸出 2 1 1,2,2 2,2 1,2 和演算法 回溯 位運算 求子集類似,只不過需要剔除相同的組合。class solution arrays.sort nums ...
90 子集 II 46 全排列 回溯 剪枝
給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 1,2,2 輸出 2 1 1,2,2 2,2 1,2 param nums return var subsetswithdup function nums let tmppath ...
子集 回溯演算法
採用回溯演算法,每個數有兩種情況,選中或不選中 class solution void dfs vector nums,int len 將當前數新增到path中 代表選中該數 path.push back nums len dfs nums,len 1 將該數去掉 代表不選中該數 path.pop ...