当前位置: 首页 > news >正文

leetcode90-子集II

leetcode 90
在这里插入图片描述

思路

之前有一篇博文和本题很相似,可以参考:leetcode78-子集
本题是子集II,和子集的区别就是本题中的元素可能是重复的,并且nums是无序的,对于这种类型的题,也和之前发布的一篇博文很相似:组合总和II
这里的难点在于去重,去重的逻辑和组合总和II完全相似,首先对于无序的nums,我们需要给他进行排序,否则无法知道是否是重复的,在排序完成后,我们可以通过下一个元素和上个元素进行比较,如果相同说明是重复的,但是需要注意的是,前一个元素和后一个元素相同的时候还不能是同一个层级的,这里的startIndex是开始遍历的初始节点,如果i > startIndex的时候说明开始节点不同,和前一个元素不属于同一个层级,什么时候可能是同一个层级呢? 假设nums = [1,2,2] startIndex = 0,就是从0开始的时候,会有多个深度遍历,path = [1], path = [1,2], path = [1,2,2]都是从1开始的,也就是这些path都是从startIndex = 0开始的,往深度去遍历,这种情况就是一个层级,path = [1,2,2]的时候第三个元素和第二个元素相同但是这是可以作为答案的,所以不能return,所以需要i > startIndex

实现

var subsetsWithDup = function (nums) {
    let result = [], path = [];
    nums.sort((a, b) => a - b);
    const backtracking = (nums, startIndex) => {
        result.push([...path])
        if (startIndex === nums.length) return;
        for (let i = startIndex; i < nums.length; i++) {
            if (i > startIndex && nums[i] === nums[i - 1]) {
                continue
            }
            path.push(nums[i])
            backtracking(nums, i + 1)
            path.pop()
        }
    }
    backtracking(nums, 0)
    return result;
};

相关文章:

  • 我的编程之旅:从零到无限可能
  • 剖析 Redis 缓存更新策略:保障数据一致性与系统性能的平衡
  • 光传输设备现状
  • 刷题日记day14-字符串-数组去重和排序
  • flutter 专题 七十四 Flutter开发之动画
  • 【Docker镜像】Python项目之使用Dockerfile构建镜像(二)
  • 在Trae中设置Python解释器版本
  • 从零实现3D自动标注:MS3D、MS3D++
  • Android 项目问题:The specified Android SDK Build Tools version (28.0.3) is ignored
  • 【SMBIOS数据块类型列表】
  • 精心整理-2024最新网络安全-信息安全全套资料(学习路线、教程笔记、工具软件、面试文档).zip
  • SQL Server:当在删除数据库时因为存在触发器而无法删除
  • 中小型企业网络的搭建
  • c++学习系列----006. c++模板(函数模板)
  • 静态网页应用开发环境搭建实战教程
  • Manim 输出视频尺寸设置
  • CD20.【C++ Dev】类和对象(11) 日期类对象的成员函数(++、--、日期-日期)
  • C++:allocator类(动态数组续)
  • Playwright设置base_url的三种方式
  • BUUCTF-web刷题篇(3)
  • “五一”假期预计全社会跨区域人员流动量超14亿人次
  • 结婚这件事,年轻人到底怎么想的?
  • 解读|特朗普“助攻”下加拿大自由党“惨胜”,卡尼仍需克服“特鲁多阴影”
  • 人社部:一季度全国城镇新增就业308万人,同比增加5万人
  • 一周人物|卡鲁等入围英国特纳奖,李学明新展中国美术馆
  • 阿里千问3系列发布并开源:称成本大幅下降,性能超越DeepSeek-R1