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

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 listprivate List<List<Integer>> result = new ArrayList<>();//Decision pathprivate 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 resultresult.add(new ArrayList<Integer>(path));//Iterate from start, removing elements that have already been selectedfor (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 pathpath.add(nums[i]);backtrack(nums, i + 1);//Recover the current decision pathpath.remove(path.size() - 1);}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生之深入解析Kubernetes中服务的性能

一、Pyroscope 简介 ① 什么是 Pyroscope&#xff1f; 开发人员通常需要查看生产应用程序中的性能瓶颈以确定问题的原因&#xff0c;为此通常需要可以通过日志和代码工具收集的信息。不幸的是&#xff0c;这种方法通常很耗时&#xff0c;并且不能提供有关潜在问题的足够详细信…

.NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题

背景 随着公司微信相关业务场景的不断拓展&#xff0c;从最初的一个微信移动应用、然后发展成微信公众号应用、然后又有了微信小程序应用。但是随着应用的拓展&#xff0c;如何保证相同用户的微信用户在不同应用中登录的同一个账号呢&#xff1f;今天的主题就来了.NET微信网页…

Modbus转Profinet网关配置步骤

Modbus转Profinet网关&#xff08;XD-MDPN100/200&#xff09;是用于将Modbus协议和Profinet协议进行转换并进行通迅的设备。Modbus转Profinet网关&#xff08;XD-MDPN100/200&#xff09;无论是新项目还是改造项目都可轻松配置完成通迅互联。 正确的安装和配置对于确保设备的正…

LVM逻辑卷管理

lvm的特点 #传统分区的缺点: 传统的文件系统是基于分区的&#xff0c;一个文件系统对应一个分区。这种方式比较直观&#xff0c;但不易改变。当一个分区空间已满时&#xff0c;无法对其扩充&#xff0c;只能采用重新分区&#xff0f;建立文件系统&#xff0c;非常麻烦&#…

【教3妹学编程-算法题】反转二叉树的奇数层

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;“你不是真正的快乐&#xff0c; 你的…

机器学习入门笔记

文章目录 背景具体步骤1.环境搭建2.写个demo1.数据处理2.分割数据集3.用模型训练数据&#xff0c;并得到预测结果4.绘制结果5.评估 背景 最近学习了一些关于机器学习的内容&#xff0c;做个笔记。 具体步骤 1.环境搭建 需要用到的工具&#xff1a;pycharm&#xff0c;anaco…

Cloudflare始终使用HTTPS且带参数跳转到www的域名

文章目录 设置教程设置图跳转实测 设置教程 关闭 SSL/TLS -> 边缘证书 的 Always Use HTTPS 规则 -> 页面规则 -> URL: http://www.example.com/* 设置成始终使用HTTPS 规则 -> 页面规则 -> URL: example.com/* 设置成 转发URL301重定向到 to https://www.ex…

【深度学习目标检测】七、基于深度学习的火灾烟雾识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

大数据Doris(三十六):Duplicate 模型(冗余模型)介绍

文章目录 Duplicate 模型(冗余模型)介绍 一、创建doris表 二、插入数据

JVM的类的生命周期

目录 前言 1. 加载&#xff08;Loading&#xff09;&#xff1a; 2. 验证&#xff08;Verification&#xff09;&#xff1a; 3. 准备&#xff08;Preparation&#xff09;&#xff1a; 4. 解析&#xff08;Resolution&#xff09;&#xff1a; 5. 初始化&#xff08;Ini…

一个可以找回误删文件的技巧,抓紧收藏吧

U盘文件夹误删是我们在日常生活中经常会遇到的问题之一&#xff0c;也是一种令人头疼的数据丢失情况。这种情况的发生&#xff0c;往往是由于用户的误操作、病毒攻击或者系统错误等原因引起的。误删文件夹可能会导致重要数据的丢失&#xff0c;从而影响工作、学习或生活。本文将…

HHDESK个性化脚本功能

HHDESK可以把脚本配置在对话框中&#xff0c;生成按钮&#xff0c;便捷操作。 在界面下方的脚本框中&#xff0c;点击“”&#xff0c;选择新建&#xff1b; 随后在弹出框内填写名称及脚本&#xff0c;按需求选择填写参数&#xff0c;及运行过程中是否弹出参数框&#xff1b;…