leetcode 90. 子集 II(Subsets II) beat 98.57%

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

原题链接

思路:

回溯,套用子集1的做法,这个排序很重要,不然gg

class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        Arrays.sort(nums);//想套用子集1的做法,这个排序很重要,不然gg

        dfs(nums, 0, list, ans);
        return ans;
    }
    
    public void dfs(int[] nums, int m, List<Integer> list, List<List<Integer>> ans) {
    	ans.add(new ArrayList<>(list));
    	for(int i=m;i<nums.length;i++)
    	{
    		if(i>m && nums[i] == nums[i-1])
    			continue;
    		list.add(nums[i]);
    		dfs(nums,i+1,list,ans);    		
    		list.remove(list.size()-1);
    	}
    }
}

一样的做法,不同的风格 100%

class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
		Arrays.sort(nums);
		List<List<Integer>> result=new ArrayList<List<Integer>>();
		List<Integer> list=new ArrayList<Integer>();
		getSubsetWithDup(result,list,nums,0);
		return result;
	
	
    }
    private void getSubsetWithDup(List<List<Integer>> result, List<Integer> list, int[] nums, int index) {
		result.add(new ArrayList<Integer>(list));
		for(int i=index;i<nums.length;i++)
		{
            if(i>index&&nums[i]==nums[i-1])continue;
			list.add(nums[i]);
			getSubsetWithDup(result, list, nums, i+1);
			list.remove(list.size()-1);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41793113/article/details/82810742