5. 子集Ⅱ

题目描述

给你一个整数数组nums,其中可能包含重复的元素。返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集。返回的解集中,你可以按任意顺序返回解集。

题目链接

https://leetcode-cn.com/problems/subsets-ii/

复杂度分析

时间复杂度分析:
O(n * 1 << n)
一共1 << n个状态,每种状态需要O(n)的时间来构造子集。
空间复杂度分析:
O(n)
即构造子集使用的临时数组t的空间代价。

说明

在第一版子集的基础上,增加不能重复

示例:
[4,4,4,1,4]
第一版的结果:(有重复)
[[],[4],[4,4],[4,4,4],[1],[4,1],[4,4,1],[4,4,4,1],[4,4,4,4],[1,4],[4,1,4],[4,4,1,4],[4,4,4,1,4]]
增加排序后的结果:(无重复)
[[],[1],[4],[1,4],[4,4],[1,4,4],[4,4,4],[1,4,4,4],[4,4,4,4],[1,4,4,4,4]]

将示例进行排序,排好序后,在按第一版操作即可。

代码

class Solution {
    List<Integer> t = new ArrayList<>();
    List<List<Integer>> ans = new ArrayList<List<Integer>>();

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);

        for (int i = 0; i < (1 << n); i++) {
            t.clear();
            for (int j = 0; j < n; j++) {
                if ((i & (1 << j)) != 0) {
                    t.add(nums[j]);
                } 
            }

            if (!ans.contains(t)) {
                ans.add(new ArrayList<Integer>(t));
            }
        }

        return ans;
    }
}
posted @ 2022-01-25 11:12  jsqup  阅读(24)  评论(0编辑  收藏  举报