leetcode-90:子集 II

简介: leetcode-90:子集 II

题目

题目链接

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

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

示例 1:

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

示例 2:

输入:nums = [0]
输出:[[],[0]]

解题

方法一:回溯

leetcode-78:子集的思路,只不过此题,可以只能用nums里面出现过的数字,每个数字只能用一次

类似leetcode-39:组合总和leetcode-40:组合总和 II的区别

用的是同一种去重的方式

横向不能重复,纵向可以。

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracing(vector<int>& nums,int startIndex){
        res.push_back(path);
        for(int i=startIndex;i<nums.size();i++){
            if(i>startIndex&&nums[i]==nums[i-1]) continue; //去重
            path.push_back(nums[i]);
            backtracing(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(),nums.end());   
        backtracing(nums,0);
        return res;
    }
};

java

class Solution {
    List<List<Integer>> res=new LinkedList<>();
    List<Integer> path=new LinkedList<>();
    void dfs(int[] nums,int startIndex,boolean[] used){
        res.add(new LinkedList<>(path));
        for(int i=startIndex;i<nums.length;i++){
            if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue;
            used[i]=true;
            path.add(nums[i]);
            dfs(nums,i+1,used);
            path.remove(path.size()-1);
            used[i]=false;
        }
    }
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        boolean[] used=new boolean[nums.length];
        Arrays.sort(nums);
        dfs(nums,0,used);
        return res;
    }
}
相关文章
|
6月前
|
Go
golang力扣leetcode 416.分割等和子集
golang力扣leetcode 416.分割等和子集
44 0
|
6月前
leetcode-1994:好子集的数目
leetcode-1994:好子集的数目
65 0
|
3月前
|
算法
LeetCode第90题子集II
LeetCode第90题"子集II"的解题方法,通过排序和回溯算法生成所有不重复的子集,并使用一个boolean数组来避免同一层中的重复元素,展示了解决这类问题的编码技巧。
LeetCode第90题子集II
|
3月前
|
Python
【Leetcode刷题Python】416. 分割等和子集
LeetCode 416题 "分割等和子集" 的Python解决方案,使用动态规划算法判断是否可以将数组分割成两个元素和相等的子集。
31 1
|
3月前
|
索引 Python
【Leetcode刷题Python】78. 子集
LeetCode题目78的Python编程解决方案,题目要求给定一个互不相同的整数数组,返回该数组所有可能的子集(幂集),且解集中不能包含重复的子集。
24 1
|
3月前
|
算法
LeetCode第78题子集
文章分享了LeetCode第78题"子集"的解法,使用递归和回溯算法遍历所有可能的子集,展示了将子集问题视为树形结构进行遍历的解题技巧。
|
5月前
|
机器学习/深度学习 存储 算法
LeetCode题目 90:五种算法 回溯\迭代\位掩码\字典树\动态规划实现 子集ll
LeetCode题目 90:五种算法 回溯\迭代\位掩码\字典树\动态规划实现 子集ll
|
5月前
|
存储 机器学习/深度学习 算法
力扣78题:生成子集
力扣78题:生成子集
|
6月前
|
算法
leetcode代码记录(子集
leetcode代码记录(子集
30 0
|
6月前
|
Go
golang力扣leetcode 90.子集II
golang力扣leetcode 90.子集II
33 1