JavaLeetCode90。サブセットII

繰り返される要素を含む可能性のある整数配列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;

        }
    }
}

おすすめ

転載: blog.csdn.net/sakura_wmh/article/details/110791305