leetcode90. 子集 II

题目

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

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

示例:

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

解题

  • 递归 + 回溯
  • 先排序
  • 注意重复元素剔除
  • 空集也是一个子集
class Solution {
    List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        if (nums == null) {
            return result;
        }
        // 排序
        Arrays.sort(nums);
        findSubset(nums, 0, new ArrayList<>());
        // 空集也是一个子集
        result.add(new ArrayList<>());
        return result;
    }

    private void findSubset(int[] nums, int index, List<Integer> temp){

        for (int i = index; i < nums.length; i++){
            // 去除重复元素
            if (i > index && nums[i] == nums[i - 1]) {
                continue;
            }
            temp.add(nums[i]);
            result.add(new ArrayList<>(temp));
            findSubset(nums, i + 1, temp);
            // 回溯
            temp.remove(temp.size() - 1);
        }
    }

}

你可能感兴趣的:(leetcode,LeetCode题解,leetcode90.,子集,II,leetcode90,子集,II,递归,回溯)