1. 程式人生 > >【leetcode】90.(Medium)Subsets II

【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; } }

執行結果:
在這裡插入圖片描述