[LeetCode] 90. Subsets II

来源:互联网 发布:聊天室软件开发 编辑:程序博客网 时间:2024/06/04 00:48

【原题】
Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

[  [2],  [1],  [1,2,2],  [2,2],  [1,2],  []]

【解释】
作为Subsets一题的follow up,要求在给定序列有重复元素的情况下求出所有子集。
【思路】
在这里,由于元素互异,所有可以不排序。但在有重复元素的情况下,由于重复的元素有可能不在一块,所以一定要排序。基本的思路为不重复添加已经添加过得子集:
比如给定序列{1,2,2}
初始化:{{}}
第一次:{{},{1}}
第二次:{{},{1},{2},{1,2}}
第三次:{{},{1},{2},{1,2}},遇到重复的元素,加粗的子集是上一个2添加形成的,当再次遇到2时,需要添加到之前2没有添加的子集即加粗的部分。最终形成{{},{1},{2},{1,2},{2,2},{1,2,2}}

public class Solution {    public List<List<Integer>> subsetsWithDup(int[] nums) {        List<List<Integer>> results=new ArrayList<List<Integer>>();        results.add(new ArrayList<Integer>());        int preEnd=0;        Arrays.sort(nums);//必须排序        for(int i=0;i<nums.length;i++){            int n=results.size();            int start;            if(i>0&&nums[i]==nums[i-1]) start=preEnd;//若有重复,则不重复添加已经添加过的子集,从preEnd开始添加            else start=0;            List<Integer> tmp = null;            for(int j=start;j<n;j++){                tmp=new ArrayList<>(results.get(j));                tmp.add(nums[i]);                results.add(tmp);                           }            preEnd=n;        }        return results;    }}

也可以使用之前的方法,然后在加入集合的时候,判断该子集是否在集合当中,这孩子能够方法效率不高,且和Subsets类似这里不再赘述。