【leetcode】90.(Medium)Subsets II

解题思路:
和subsets I相比多了一个start位置的设置。
对于[1,2,2]
有初始子集合:[] [1]
对于nums[1]=2,由于nums[1]!=nums[0],故从0位开始叠加2并加入到结果中,可得:
[] [1] [2] [1,2]

对于nums[2]=2,由于nums[2]=nums[1],故start=2即[2]开始叠加,可以得到:
[] [1] [2] [1,2] [2,2] [1,2,2]
主要还是维护这个start


提交代码:

class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
    	List<List<Integer>> ans=new ArrayList<List<Integer>>();
    	List<Integer> base=new ArrayList<Integer>();
    	List<Integer> tmp=new ArrayList<Integer>();
    	tmp.addAll(base);
    	ans.add(tmp);
    	if(nums.length==0)		return ans;
        Arrays.sort(nums);
    	base.add(nums[0]);
    	tmp=new ArrayList<Integer>();
    	tmp.addAll(base);
    	ans.add(tmp);
    	base.remove((Integer)nums[0]);
    	
    	int start=1;
    	for(int i=1;i<nums.length;i++) {
    		start=addSubSet(i,nums,start,ans);
    	}
    	return ans;
    }
    
    public int addSubSet(int p,int[] nums,int start,
    		List<List<Integer>> ans) {
    	int size=ans.size();
    	if(nums[p]==nums[p-1]) {
    		for(int i=start;i<size;i++) {
    			List<Integer> tmp=new ArrayList<Integer>();
    			tmp.addAll(ans.get(i));
    			tmp.add(nums[p]);
    			ans.add(tmp);
    			//System.out.println(ans);
    		}
    	}else {
    		for(int i=0;i<size;i++) {
    			List<Integer> tmp=new ArrayList<Integer>();
    			tmp.addAll(ans.get(i));
    			tmp.add(nums[p]);
    			ans.add(tmp);
    		//	System.out.println(ans);
    		}
    	}
    	return size;
}
}


运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/84650503
今日推荐