leetcode.90----------子集

博客介绍了如何解决LeetCode第90题子集问题,特别是处理数组中存在重复元素的情况。关键在于对数组排序后,在深度优先搜索(DFS)过程中进行去重操作,避免在同层生成重复子集。通过比较遍历下标j和回溯函数参数i来判断是否为同层重复,以确保正确生成所有可能的子集。
摘要由CSDN通过智能技术生成

解题思路

求子集问题本质上是求指定的若干元素的不超固定长度的组合问题,具体来说,就是给你一个数组nums,nums.length=n,每次从nums中取出数目不超过n的元素,求所有的取法,也就是求组合

现在问题的关键是nums里有重复元素,如果还是按照78.子集的做法,最后求出来的解集肯定有重复的。所以在dfs之前,需要先对nums排序,排序后nums里相同的元素必定相邻,然后在遍历解空间树的时候,要做一个去重的操作,当遇到重复出现,也就是和前面相邻元素相同的时候,直接跳过该节点,不让它向下递归

注意“去重”操作是在同层中进行的,不同层的相同元素不能“去重”。
比如nums=[1,2,2],根节点有三个子节点,即1,2和2,
当for循环到该层的最后一个子节点,即重复出现的那个2的时候,需要及时掐断,不再向下递归;
而从该层的第一个子节点开始,即1处,向下dfs到倒数第二层,会遇到重复出现的那个2,此时是身处两个不同层的元素的比较,如果只是单纯的判断它和前面的nums元素相同就不再向下递归,那么子集[1,2,2]就产生不出来。

要实现同层比较的关键就是比较for循环里的j和回溯函数的实参i,j是当前检查元素下标;i是本层开始检查的元素下标
如果nums[j]是在同层的在for循环里重复出现的,那么j肯定大于i,否则比较的两个元素就处于不同层

class Solution {
    ArrayList<List<Integer>> res=new Array
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值