LeetCode-90-子集Ⅱ

题目描述:给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

题目链接:LeetCode-90-子集Ⅱ

解题思路:跟 组合总和Ⅱ相似,都需要去重操作。

注意要先对数组排序,方便去重。
代码实现:

java 复制代码
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);//先排序,有利于去重
        boolean[] use = new boolean[nums.length];// use[i]=true,表示该位置已经被用过了
        backTracking(nums, 0, use);
        return res;
    }

    public void backTracking(int[] nums, int startIndex, boolean[] use){
        res.add(new ArrayList<>(path));//要找的是每个节点,而不仅是叶子节点
        if (startIndex >= nums.length){
            return;
        }
        for (int i = startIndex; i < nums.length; i++) {
            if (i>0 && nums[i-1] == nums[i] && use[i-1]==false){// 树层去重,如[1,2,2],第一个2已经走过了,就不走第二个 2 了
                continue;
            }
            path.add(nums[i]);
            use[i] = true;
            backTracking(nums, i+1, use);
            path.remove(path.size()-1);
            use[i] = false;
        }
    }
}
相关推荐
2301_7657031425 分钟前
C++与自动驾驶系统
开发语言·c++·算法
Ll130452529829 分钟前
Leetcode二叉树 part1
b树·算法·leetcode
鹿角片ljp30 分钟前
力扣9.回文数-转字符双指针和反转数字
java·数据结构·算法
热爱编程的小刘39 分钟前
Lesson04---类与对象(下篇)
开发语言·c++·算法
有代理ip1 小时前
成功请求的密码:HTTP 2 开头响应码深度解析
java·大数据·python·算法·php
YYuCChi1 小时前
代码随想录算法训练营第三十四天 | 62.不同路径、63.不同路径||
算法
小明同学012 小时前
[C++进阶] 深度解析AVLTree
c++·算法·visualstudio
CoderCodingNo2 小时前
【GESP】C++五级练习题 luogu-P1031 [NOIP 2002 提高组] 均分纸牌
开发语言·c++·算法
梯度下降中3 小时前
求职面试中的线代知识总结
人工智能·线性代数·算法·机器学习
SmartBrain3 小时前
OCR 模型在医疗场景的选型研究
人工智能·算法·语言模型·架构·aigc·ocr