LeetCode第90题子集II

简介: LeetCode第90题"子集II"的解题方法,通过排序和回溯算法生成所有不重复的子集,并使用一个boolean数组来避免同一层中的重复元素,展示了解决这类问题的编码技巧。

继续打卡算法题,今天学习的是LeetCode第90题子集II,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

image.png

分析一波题目

之前学习过78题子集,本题和78题只有一个不同,就是本题中元素是可以重复的,那么我们就需要去重了。

image.png

我们可以发现,在同一层如果出现相同的需要去重。我们可以使用boolean数组表示某个元素在某一层是否使用过。

本题解题技巧

1、通过树结构表达求子集组合的过程,对同一层的元素进行去重,避免重复的子集

2、需要去重,我们要对原数组排序

编码解决

class Solution {
   
   

     List<List<Integer>> result = new ArrayList<>();


    public List<List<Integer>> subsetsWithDup(int[] nums) {
   
   
        //排序为了去重
        Arrays.sort( nums );
        int n = nums.length;
        boolean[] used = new boolean[n];
        List<Integer> subResult= new ArrayList<>();
        getSubResult( subResult, 0,nums,n, used);
        return result;

    }



    public void getSubResult( List<Integer> subResult,int start,int[] nums,int n,boolean[] used) {
   
   

        //满足了组合条件,是一个子集
        result.add(subResult);
        //遍历到最后一个元素了,除了自己,没有其他组合了,需要结束
        if(start >= n) {
   
   
            return;
        }

        for(int i=start; i<n; i++) {
   
   
            //同一层去重
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
   
   
                continue;
            }
            List<Integer> tempSubResult= new ArrayList<>();
            tempSubResult.addAll(subResult);
            tempSubResult.add(nums[i]);
            used[i] = true;
            //递归
            getSubResult( tempSubResult, i+1,nums,n, used);
            //开始遍历下一层了
            used[i] = false; 
        }    
    }
}

总结

1、子集问题,画图之后就好理解了,先理思路再画图就能比较好的求解。

相关文章
|
7月前
|
Go
golang力扣leetcode 416.分割等和子集
golang力扣leetcode 416.分割等和子集
45 0
|
7月前
leetcode-1994:好子集的数目
leetcode-1994:好子集的数目
68 0
|
4月前
|
Python
【Leetcode刷题Python】416. 分割等和子集
LeetCode 416题 "分割等和子集" 的Python解决方案,使用动态规划算法判断是否可以将数组分割成两个元素和相等的子集。
40 1
|
4月前
|
索引 Python
【Leetcode刷题Python】78. 子集
LeetCode题目78的Python编程解决方案,题目要求给定一个互不相同的整数数组,返回该数组所有可能的子集(幂集),且解集中不能包含重复的子集。
29 1
|
4月前
|
算法
LeetCode第78题子集
文章分享了LeetCode第78题"子集"的解法,使用递归和回溯算法遍历所有可能的子集,展示了将子集问题视为树形结构进行遍历的解题技巧。
|
6月前
|
机器学习/深度学习 存储 算法
LeetCode题目 90:五种算法 回溯\迭代\位掩码\字典树\动态规划实现 子集ll
LeetCode题目 90:五种算法 回溯\迭代\位掩码\字典树\动态规划实现 子集ll
|
6月前
|
存储 机器学习/深度学习 算法
力扣78题:生成子集
力扣78题:生成子集
|
7月前
|
算法
leetcode代码记录(子集
leetcode代码记录(子集
32 0
|
7月前
|
Go
golang力扣leetcode 90.子集II
golang力扣leetcode 90.子集II
36 1
|
7月前
|
Java
leetcode-90:子集 II
leetcode-90:子集 II
43 1