LeetCode——子集 i-ii

Q:现在有一个没有重复元素的整数集合S,求S的所有子集
注意:

  • 你给出的子集中的元素必须按非递增的顺序排列
  • 给出的解集中不能出现重复的元素

例如:
如果S=[1,2,3], 给出的解集应为:
[↵ [3],↵ [1],↵ [2],↵ [1,2,3],↵ [1,3],↵ [2,3],↵ [1,2],↵ []↵]

A:

    ArrayList<ArrayList<Integer>> res = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
        if (nums.length == 0)
            return res;
        //保证非递增
        Arrays.sort(nums);
        ArrayList<Integer> array = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            //i是这次需要的数量
            DFS(array, i, 0, nums);
        }
        return res;
    }

    private void DFS(ArrayList<Integer> array, int count, int start, int[] nums) {
        if (count < 0)
            return;
        else if (count == 0)
            res.add(new ArrayList<>(array));
        else {
            for (int i = start; i < nums.length; i++) {
                array.add(nums[i]);
                //从当前的下一个开始,count的数量减一,开始的地方加一
                DFS(array, count - 1, i + 1, nums);
                array.remove(array.size() - 1);
            }
        }
    }

Q:给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集。
注意:

  • 你给出的子集中的元素要按非递增的顺序排列
  • 给出的解集中不能包含重复的子集

例如:
如果S =[1,2,2], 给出的解集应该是:
[↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]

A:比上一个多加一个判断条件

    ArrayList<ArrayList<Integer>> res = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
        if (nums.length == 0)
            return res;
        Arrays.sort(nums);
        ArrayList<Integer> array = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            DFS(array, i, 0, nums);
        }
        return res;
    }

    private void DFS(ArrayList<Integer> array, int count, int start, int[] nums) {
        if (count < 0)
            return;
        else if (count == 0)
            res.add(new ArrayList<>(array));
        else {
            for (int i = start; i < nums.length; i++) {
                if (i > start && nums[i] == nums[i - 1])
                    continue;
                array.add(nums[i]);
                DFS(array, count - 1, i + 1, nums);
                array.remove(array.size() - 1);
            }
        }
    }
posted @ 2020-03-19 21:41  Shaw_喆宇  阅读(224)  评论(0编辑  收藏  举报