Leetcode 90 子集 II

题意理解

        求一个集合的子集:该集合有重复元素。

        集合[1,2,2]

        []、[1]、[2]、[2]、[12]、[12]、[22]、[122]

        子集:[]、[1]、[2]、[12]、[22]、[122]——由于元素有重复需要对子集进行去重操作。

        所以此题的难点在于:子集去重

解题思路

        首先明确,组合类、子集类、排列类都可以使用回溯的方法来做。

        所以,要将问题的解决抽象成一棵树。

如图所见,所有子集在每个节点处收集。

特别的,有两个地方发生了剪枝。所以我们何时进行剪枝操作呢?——发生重复子集时,剪枝。

这里引入《代码随想录》中所说的:树层去重的逻辑。

什么是树层去重

        当前层树枝取到重复数字时,则可能回触发重复结果的产生。

        如何判断是否取得相同值呢?可以使用nums[i]==nums[i-1]来进行判断。

        但是:如[2,2]子集,满足nums[i]==nums[i-1],但是不是同层。

        如何判断是同一层呢?使用used[]数组来维护一个当前集合是否访问过的状态。

        若used[i-1]=0且nums[i]==nums[i-1],则说明,同层有重复值。详细可以在树结构上理解。

        used[i-1]=0且nums[i]==nums[i-1],就是当前分支新的探索范围是从当前值往后,上一个值已经作为一个分支处理过了,又因为nums[i]==nums[i-1],这就会导致重复的子集分支,故此种情况需要剪枝。

        used[i-1]=1且nums[i]==nums[i-1],就是当前分支新的探索范围是从当前值往后,且当前分支在该子集内,虽然nums[i]==nums[i-1],但是他们属于同一个树枝的不同层。所以不会导致同层树枝取相同数值导致重复问题,故不需要剪枝。

1.暴力回溯+剪枝优化

解决子集问题,可以使用回溯算法,将解题思路抽象成一棵树。

前提准确:nums数组应提前处理为有序数组,以便后续操作。

明确回溯算法的三个步骤:结果在每一个节点收集,每进入一次递归函数,就相当于达到一个节点,所以在方法已进入的地方收集结果

        确定返回值和参数列表,一般是void

        确定终止条件

        确定单层逻辑。

List<List<Integer>> result=new ArrayList<>();
    LinkedList<Integer> path=new LinkedList<>();
    boolean[] used=null;
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        used=new boolean[nums.length];//默认值false
        Arrays.sort(nums);
        backtracking(nums,0);
        return  result;
    }

    public void backtracking(int[] nums,int satrtIndex){
        result.add(new ArrayList<>(path));
        if(satrtIndex>=nums.length) return;
        //其实可以省略,satrtIndex>=nums.length时,不会进下面的循环,方法直接结束
        //但是写着方便理解
        for(int i=satrtIndex;i<nums.length;i++){
            //数层剪枝
            if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue;
            path.add(nums[i]);
            used[i]=true;
            //递归
            backtracking(nums,i+1);
            //回溯操作
            path.removeLast();
            used[i]=false;
        }
    }

2.分析

时间复杂度:O(n\times 2^{n})

空间复杂度:O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/238903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

temu国内三大仓库在哪里

在拼多多跨境电商平台Temu的运营过程中&#xff0c;仓储物流是至关重要的一环。根据现有资料&#xff0c;Temu在国内设有三个主要仓库&#xff0c;分别位于广州、义乌和香港。这些仓库的位置选择是基于地理优势和市场需求的考虑。 先给大家推荐一款拼多多/temu运营工具——多多…

压缩软件电脑版哪个好?

压缩软件是我们存储文件、清理电脑、向他人发送文件经常用到的工具&#xff0c;下面就从头到尾操作一遍各个软件压缩步骤&#xff0c;根据需求选择好啦。可以放心的是&#xff0c;这四款软件都经过了安全测试&#xff0c;能够保证文件的安全性&#xff0c;并且能够兼容多种操作…

3_流量预测综述阅读_Cellular traffic prediction with machine learning: A survey

为了方便学习英语书写&#xff0c;总结的一些话用英语书写 ♥目录♥ 0、文献来源and摘要1、introduction2、prediction problems and datasets2.1 prediction problems2.2 dataset&#xff08;1&#xff09;Telecom Italia 意大利电信 2015&#xff08;2&#xff09;City Cell…

OOD : DMAD Diversity-Measurable Anomaly Detection

Diversity-Measurable Anomaly Detection 基于重建的异常检测模型通过抑制异常的泛化能力来迭代学习。然而&#xff0c;由于这种抑制&#xff0c;不同的正常模式的重建效果也会变得不理想。为了解决这个问题&#xff0c;本文提出了一种称为多样性可测量异常检测&#xff08;DMA…

计算机网络编程

网络编程 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c; Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 计算机网络基础 2. So…

射频功率放大器的参数有哪些

射频功率放大器是射频通信系统中重要的组件&#xff0c;用于将输入的射频信号放大到需要的功率水平。在设计和选择射频功率放大器时&#xff0c;需要考虑多种参数。下面西安安泰将详细介绍射频功率放大器的常见参数。 1、P1dB功率压缩点 当放大器的输入功率比较低时&#xff0c…

2024年AI云计算专题研究报告:智算带来的变化

今天分享的人工智能系列深度研究报告&#xff1a;《2024年AI云计算专题研究报告&#xff1a;智算带来的变化》。 &#xff08;报告出品方&#xff1a;华泰证券&#xff09; 报告共计&#xff1a;32页 Al 云计算 2024:关注智算带来的新变化 通过对海内外主要云厂商及其产业链…

Godot Engine:跨平台游戏开发的新境界 | 开源日报 No.92

godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎&#xff0c;可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具&#xff0c;让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上&#xff0c;包…

crmeb后台自定义菜单并生成代码

crmeb v5 版本&#xff0c; 前后端分端 后台菜单的生成 进入后台界面之后&#xff0c;我们可以看到界面如下 找到 维护->开发配置->权限维护->添加规则按扭 我们要在设置的 菜单之下&#xff0c;添加一个 基础配置的 子菜单 提交之后&#xff0c;刷新页面就会在列…

在开发微信小程序的时候,报错navigateBack:fail cannot navigate back at firstpage

这个错误的意思是&#xff1a;在这个页面已经是第一个页面了&#xff0c;没办法再返回了 报错原因 这个错误原因其实也简单&#xff0c;就是在跳转的时候使用了wx.redirectTo()&#xff0c;使用wx.redirectTo()相当于重定向&#xff0c;不算是从上一个页面跳转过来的&#xf…

消费升级:无人零售的崛起与优势

消费升级&#xff1a;无人零售的崛起与优势 随着人们生活水平的提高&#xff0c;消费内容正在从生存型消费转向以精神体验和享乐为主的发展型消费。社会居民的消费结构不断变迁&#xff0c;明显呈现消费升级趋势。个性化和多元化消费势头正在崛起&#xff0c;特别是无人零售的自…

nextcloud如何将一个文件共享给所有人

nextcloud能够将文件/文件夹共享给某个用户或者用户组或者生成链接分享&#xff0c;但是无法直接将某个文件共享给nextcloud内部所有用户&#xff0c;并且nextcloud只有分组的概念&#xff0c;没有分组上下级的概念。 我们可以一个用户一个用户的共享&#xff0c;或者创建一个…

使用rancher rke快速安装k8s集群

概述 Rancher Kubernetes Engine&#xff08;RKE&#xff09;是一个用于部署、管理和运行Kubernetes集群的开源工具。旨在简化Kubernetes集群的部署和操作。 RKE具有以下特点和功能&#xff1a; 简化的部署过程 RKE提供了一个简单的命令行界面&#xff0c;使您可以轻松地部署…

WhatsApp全球获客怎么做?

一、导语 随着全球数字化趋势的加速&#xff0c;WhatsApp作为一种即时通讯工具&#xff0c;已经成为了连接全球用户的桥梁。 对于企业和营销人员来说&#xff0c;利用WhatsApp拓展全球业务是一种非常有效的策略&#xff0c;本文将为您揭示WhatsApp全球获客的秘密&#xff0c;…

【pytest】单元测试文件的写法

前言 可怜的宾馆&#xff0c;可怜得像被12月的冷雨淋湿的一条三只腿的黑狗。——《舞舞舞》 \;\\\;\\\; 目录 前言test_1或s_test格式非测试文件pytest.fixture()装饰器pytestselenium test_1或s_test格式 要么 test_前缀 在前&#xff0c;要么 _test后缀 在后&#xff01; …

从头到尾的数据之旅

目录 引言 链表介绍 单向链表的接口实现 结构 创建节点 头插 尾插 头删 尾删 打印 节点查找 节点前插入 节点删除 内存释放 总结 引言 在前面的学习中&#xff0c;我们深入了解了顺序表&#xff0c;通过其增删查改的操作&#xff0c;我们发现了顺序表在某些情况…

MistralAI发布全球首个MoE大模型-Mixtral 8x7B,创新超越GPT-4

引言 MistralAI&#xff0c;一家法国的初创企业&#xff0c;近期在AI界引发了轰动&#xff0c;刚刚发布了全球首个基于MoE&#xff08;Mixture of Experts&#xff0c;混合专家&#xff09;技术的大型语言模型——Mistral-8x7B-MoE。这一里程碑事件标志着AI技术的一个重要突破…

【文心一言】使用飞桨 AI Studio 快速搭建,看图识猜成语应用

目录 一、背景二、实践三、创建应用3.1、零代码开发3.2、应用名称3.2、模型训练3.3、开始训练 四、应用部署4.1、发布项目4.2、搜索应用4.3、应用部署4.4、获取令牌4.4、导入依赖4.5、配置CORS4.6、使用测试API4.7、运行4.8、测试API接口4.9、前端API接口 五、启动前端5.1、模块…

百度文库下载要用券?Kotlin爬虫几步解决

百度作为国内知名的网站&#xff0c;尤其是文库里面有各种丰富的内容&#xff0c;对我们学习生活都有很大的帮助&#xff0c;就因为其内容丰富&#xff0c;如果看见好用有意思的文章还用复制粘贴等方式就显得有点落后了&#xff0c;今天我将用我所学的爬虫知识给你们好好上一课…

git 相关操作说明

1.先下载git相关软件 下载地址&#xff1a; https://git-scm.com/download/win下载其中一个安装 2.打开gitee网站&#xff0c;注册账号 3.打开个人中心&#xff0c;选择ssh公钥&#xff0c;查看如何生成公钥 4.生成公钥后&#xff0c;添加相应的公钥 具体仓库操作 1.第一…