力扣90. 子集 II(Java 回溯法)

news2024/9/23 7:31:34

Problem: 90. 子集 II

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述

思路

在本题中所给数组nums中的元素有重复,若再直接使用回溯的话会使得最终的子集有重复;其次我们应该知道求子集,求组合这类使用回溯处理的题目,在核心处理回溯时,都是以当前决策阶段为起始位置开始循环遍历(也可以理解为开始当前决策阶段的穷举),并且以当前决策阶段为基础开始下一阶段(递归调用),则在本题中:

1.对给定数组nums排序
2.在回溯函数中我们每次是令当前层的循环起始位置(i)等于当前的决策阶段(start),然后每次我们判断若i > start && nums[i] == nums[i-1]则表示这个分支(因为回溯实则上是在对决策树进行遍历处理)是重复的,则我们不“遍历”该分支(即不进行递归调用),以达到减枝删去重复元素的作用
image.png

解题方法

1.定义二维集合result作为结果集合存储每个子集,一维集合path作为决策路径
2.对原来给定的数组nums排序,并从0阶段开始调用回溯函数
3.回溯函数中:

3.1每次开始将当前决策阶段中的决策路径添加到结果集result中(即添加当前得到的子集);
3.2for循环开始当前决策阶段的穷举,循环起始位置是当前的决策阶段(假定为start),并判断若i > start && nums[i] == nums[i-1]则continue,以达到减枝去重的效果,否则在当前决策阶段的基础上递归下一阶段,最后恢复当前决策阶段的决策路径状态

复杂度

时间复杂度:

O ( n × 2 n ) O(n \times 2^n) O(n×2n)

空间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
    //Result list
    private List<List<Integer>> result = new ArrayList<>();
    //Decision path
    private List<Integer> path = new ArrayList<>();

    /**
     * Gets all subsets of a collection containing duplicate elements
     *
     * @param nums A collection of repeating elements
     * @return List<List < Integer>>
     */
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        backtrack(nums, 0);
        return result;
    }

    /**
     * Use backtracking to get all subsets of a collection containing duplicate elements
     *
     * @param nums  A collection of repeating elements
     * @param start Decision stage
     */
    public void backtrack(int[] nums, int start) {
        //Add the subset of current decision path to the result
        result.add(new ArrayList<Integer>(path));

        //Iterate from start, removing elements that have already been selected
        for (int i = start; i < nums.length; ++i) {
            //Cutting branch(remove the repetitive subset)
            if (i > start && nums[i] == nums[i - 1]) {
                continue;
            }
            //Adds the current optional element to the decision path
            path.add(nums[i]);
            backtrack(nums, i + 1);
            //Recover the current decision path
            path.remove(path.size() - 1);
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VRTK】【VR开发】【Unity】12-占位身体

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概要】 目前你会发现,就算存在非Trigger Collider的墙壁屏障等,也能够正常穿过,这会导致不沉浸的体验。你需要一个占位身体来实现让墙壁等碰撞并挡住自己…

使用rancher rke快速安装k8s集群

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

理解Socket

前言 我在去年就学习过Java中Socket的使用&#xff0c;但对于Socket的理解一直都是迷迷糊糊的。看了网上很多关于Socket的介绍&#xff0c;看完还是不太理解到底什么是Socket&#xff0c;还是很迷。直到最近在学习计算机网络&#xff0c;我才对Socket有了一个更深地理解。之前一…

GD32f103系列教程—(程序下载篇)

简介 芯片程序下载的方式有很多种&#xff0c;大部分的可以支持串口&#xff0c;SWD&#xff0c;jtag等方式进行下载&#xff0c;当然还有一些芯片可以支持IIC&#xff0c;SPI&#xff0c;以太网&#xff0c;USB等方式&#xff0c;其实原理大同小异。 GD32F103系列是可以支持串…

中文字符串逆序输出

今天碰到这个题&#xff0c;让我逆序输出中文字符串&#xff0c;可给我烦死了&#xff0c;之前没有遇到过&#xff0c;也是查了资料才知道&#xff0c;让我太汗颜了。 英文字符串逆序输出很容易&#xff0c;开辟一块空间用来存放逆序后的字符串&#xff0c;从后往前遍历原字符串…

windows安装sqlserver2008后连接失败问题

刚安装好的sqlserver在安装服务器上&#xff0c;直接使用Windows身份认证登录就报错 未找到或无法访问服务器。请验证实例名称是否正确并且SQL Server已配置为允许远程连接。&#xff08;provider&#xff1a;命名管道提供程序&#xff0c;error&#xff1a;40 -无法打开到SQLS…

Springboot集成支付宝支付---完整详细步骤

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明&#xff1a;沙箱环境支持的产品&#xff0c;可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱&#xff0c;配置接口加签方式 在沙箱进行调试前…

【Stable Diffusion】在windows环境下部署并使用Stable Diffusion Web UI---通过 Conda

本专栏主要记录人工智能的应用方面的内容&#xff0c;包括chatGPT、AI绘图等等&#xff1b; 在当今AI的热潮下&#xff0c;不学习AI&#xff0c;就要被AI淘汰&#xff1b;所以欢迎小伙伴加入本专栏和我一起探索AI的应用&#xff0c;通过AI来帮助自己提升生产力&#xff1b; 订阅…

电子学会C/C++编程等级考试2021年03月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:生日相同 2.0 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。 时间限制:1000 内存限制:65536输入 第一行为整数n,表示有n个学生,n ≤ 180。此后每…

ChatGPT使用:一个发包机器人的提示词

发包机器人&#xff1a; 设想&#xff1a;目前项目组有n条打包线会输出多个包&#xff0c;用户想获取最新的包是比较困难的&#xff0c;难点在于 1. 分支多&#xff1a;trunk&#xff0c;release&#xff0c;outer等&#xff0c;至少有3个分支&#xff1b; 2. 多平台&#x…

Java小案例-RocketMQ的11种消息类型,你知道几种?(事务消息)

前言 上一节给大家讲了Rocket的延迟消息&#xff0c;这一节和大家聊一下事务消息&#xff0c;关于延迟消息大家可以点下面这个链接直接看。 事务消息 事务消息是RocketMQ提供的一种类似X/Open XA的分布式事务功能。通过RocketMQ的事务消息&#xff0c;可以达到分布式事务的最…

什么是数据可视化?数据可视化的优势、方法及示例

前言 在当今的数字时代&#xff0c;数据是企业和组织的命脉&#xff0c;生成的数据量呈指数级增长。这种被称为大数据的海量数据在洞察力和决策方面具有巨大的潜力。然而&#xff0c;如果没有一种有效的方法来分析和理解这些数据&#xff0c;它就会变得毫无意义和难以管理。这就…

SaaS 电商设计 (五) 私有化部署-实现 binlog 中间件适配

一、 背景 具体的中间件私有化背景在上文 SaaS 电商设计 (二) 私有化部署-缓存中间件适配 已有做相关介绍.这里具体讨论的场景是通过解析mysql binlog 来实现mysql到其他数据源的同步.具体比如:在电商的解决方案业务流中经常有 ES 的使用场景,用以解决一些复杂的查询和搜索商品…

GD32F4标准外设库

学习目标 了解标准库来源熟悉模板搭建流程掌握在已有模板基础下进行开发学习内容 标准外设库获取 标准固件库获取我们可以从官网进行下载。 下载链接:兆易创新GigaDevice-资料下载兆易创新GD32 MCU 找到 GD32F4xx Firmware Library 这个压缩包 下载完成后,进行解压,解压…

Java医院信息化建设云HIS系统源码

云HIS提供标准化、信息化、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程&#xff0c;提升患者满意度、基层首诊率&#xff0c;通过信息共享、辅助诊疗等手段&#xff0c;提高基层医生的服务能力构建和…

nginx 1.24.0 安装nginx最新稳定版

1.官网&#xff1a; nginx: download 2. 选择稳定版&#xff1a; 3. 可以下载&#xff0c;然后上传服务器&#xff0c;也可以wget获取&#xff1a; cd /home wget https://nginx.p2hp.com/download/nginx-1.24.0.tar.gz 4. 放入/home 下。并解压缩&#xff0c;重命名nginx;…

C之不小心就犯错误1

以为会打印&#xff1a; it is ok 然而并不是&#xff1a; 原因&#xff1a; 根据C语言隐式类型转换的原理&#xff0c;如果是int型与uint型进行比较&#xff08;其它类型同理&#xff09;&#xff0c;则会将int型数据转换为uint型&#xff0c;则-1变成了 2^32-1 429496729…

Window操作系统发展史

引言 当谈及计算机操作系统的丰富历史和多样性时&#xff0c;Windows操作系统无疑是其中的一颗璀璨明星。自1985年首次亮相以来&#xff0c;Windows经历了长足的发展&#xff0c;塑造了计算机使用体验的方方面面。从初始的简单图形用户界面到如今强大而多样的功能&…

服务器被攻击宕机的一些小建议

现在网络攻击屡有发生&#xff0c;任何网站服务器都面临这样的危险&#xff0c;服务器被攻击造成的崩溃宕机是损失是我们无法估量的。网络攻击我们无法预测&#xff0c;但做好防御措施是必须的&#xff0c;建议所有的网站都要做好防范措施&#xff0c;准备相应的防护预案&#…

“Java 已死、前端已凉”?技术变革与编程语言前景:Java和前端的探讨

前端已死话题概论 本文讨论了近期IT圈中流传的“Java 已死、前端已凉”言论。我们审视了这些言论的真实性&#xff0c;并深入探讨了技术行业的演变和新兴技术的出现对编程语言和前端开发的影响。通过分析历史发展、当前趋势和未来展望&#xff0c;我们提供了对这些话题更深层次…