繰り返される要素を含む可能性のある整数配列numsを指定すると、配列のすべての可能なサブセット(べき集合)を返します。
注:ソリューションセットに重複するサブセットを含めることはできません。
例:
入力:[1,2,2]
出力:
[
[2]、
[1]、
[1,2,2]、
[2,2]、
[1,2]、
[]
]
この質問で最も重要なことは、剪定のアイデアです。まず、現在のトラバーサル要素がすでにtrueである場合、検索を続行する必要はありません。現在のトラバーサル要素が前の要素と同じである場合、前の要素が使用されていない場合は、以下の前の要素が確実に表示されることを示します。これは要件を満たしていないため、削除する必要があります
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);//首先必须排序
List<List<Integer>> res = new ArrayList();
boolean[] pau = new boolean[nums.length];//记录已经遍历过得元素
Deque<Integer> que = new LinkedList();//存储已经遍历过得元素
back(nums,res,que,pau,0);
return res;
}
public void back(int[] nums,List<List<Integer>> res,Deque<Integer> que,boolean[] pau,int start){
res.add(new ArrayList(que));
for(int i=start;i<nums.length;i++){
if(pau[i]){
continue;
}
if(i>0&&nums[i]==nums[i-1]&&!pau[i-1]){
continue;
}
que.addLast(nums[i]);
pau[i]=true;
back(nums,res,que,pau,i+1);
que.removeLast();
pau[i]=false;
}
}
}