7.8子集(LC78-M)

算法:

其实也是组合问题,还是用回溯。

与以前不同的是,如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

什么时候for可以从0开始呢?

求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合。

画树:

回溯三部曲:

1.确定返回值和参数

返回值:void

参数:int[] nums, int startindex

2.确定终止条件

剩余集合为空的时候,就是叶子节点。

什么时候剩余集合为空呢?

就是startindex已经大于数组的长度了,就终止了,因为没有元素可取了。

startindex >= nums.size()

3.单层递归逻辑

 求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树

add 收集元素

递归

回溯,把刚刚收集的元素remove

调试过程:

class Solution {//输出为二维数组,需要两个全局变量List<List<Integer>> result = new LinkedList<>();List<Integer> path = new LinkedList<>();public List<List<Integer>> subsets(int[] nums) {backtracking(nums,0);return result;}void backtracking (int[] nums, int startindex) {//每次递归时收集pathresult.add(new LinkedList(path));//确定终止条件,直接返回;//这里不收集结果了,结果在单层递归时一个一个收集if (startindex >= nums.size()) {return;}//单层递归for (int i = startindex; i < nums.size(); i++) {path.add(nums[i]);backtracking (nums, i+1);path.removeLast();}} 
}

原因:

`nums.size()` 不是在 Java 中获取数组长度的有效语法。应该使用 `nums.length`

java中,当处理字符串时,使用 `length()` 方法来获取其长度;而当处理数组时,使用 `length` 属性来获取其长度。

在 Java 中,针对字符串类型使用 `length()` 方法获取字符串的长度:因为字符串在 Java 中是作为对象处理的,因此使用方法(也就是要加个括号,length())来访问其属性或执行操作。字符串是 Java 中的内置类,因此它具有自己的方法和属性

数组则是一种不同的数据结构。在 Java 中,数组是一种特殊的对象,但其长度是通过一个名为 `length` 的属性来获取,而不是一个方法。

正确代码:

class Solution {//输出为二维数组,需要两个全局变量List<List<Integer>> result = new LinkedList<>();List<Integer> path = new LinkedList<>();public List<List<Integer>> subsets(int[] nums) {backtracking(nums,0);return result;}void backtracking (int[] nums, int startindex) {//每次递归时收集pathresult.add(new LinkedList(path));//确定终止条件,直接返回;//这里不收集结果了,结果在单层递归时一个一个收集if (startindex >= nums.length) {return;}//单层递归for (int i = startindex; i < nums.length; i++) {path.add(nums[i]);backtracking (nums, i+1);path.removeLast();}} 
}

注意:

1.子集问题不用优化剪枝

2.子集问题的result收集位置位于递归函数的第一句话

3.子集问题、组合问题、分割问题,都是无序的,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

时间空间复杂度:

时间复杂度:

空间复杂度:

  • O(n)。临时数组path的空间代价是 O(n),递归时栈空间的代价为 O(n)。

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

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

相关文章

什么是 SPI,它有什么用?

文章目录 什么是 SPI&#xff0c;它有什么用&#xff1f; 什么是 SPI&#xff0c;它有什么用&#xff1f; SPI 全称是 Service Provider Interface &#xff0c;它是 JDK 内置的一种动态扩展点的实现。 简单来说&#xff0c;就是我们可以定义一个标准的接口&#xff0c;然后第三…

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念&#xff0c;能够说出网页的构成以及网页相关名词的含义 熟悉Web标准&#xff0c;能够归纳Web标准的构成。 了解浏览器&#xff0c;能够说出各主流浏览器的特点。 了解HTML5技术&#xff0c;能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…

如何安装ubuntu kylin(优麒麟)系统

半个月前(2020-12-25)&#xff0c;优麒麟官方发布消息说&#xff0c;优麒麟与 CodeWeavers 公司积极合作适配&#xff0c;正式推出 CrossOver 优麒麟版本&#xff0c;使优麒麟系统能够兼容运行 Windows 应用。将微信(crossover版) 和 QQ(crossover版) 上架麒麟软件商店。 优麒…

基于立锜RTQ7882,支持全协议及DP显示功能的PD快充方案

在上一篇文章【基于RTQ7882的车载PD快充方案 - 大大通 &#xff08;wpgdadatong.com&#xff09;】中&#xff0c;已经对立锜科技&#xff08;Richtek&#xff09;及主打产品RTQ7882的基本功能作了介绍。 本文将分享RTQ7882近期新增的功能&#xff0c;以及其Cost Down版本。 旨…

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用&#xff0c;异常抛出可以增强的点JoinPoint &#xff1a;也就是**被增强的方法的总称&#xff0c;可以获取具体方法的信息&#xff…

系统启动流程 - 理解modules加载流程

​编辑 Hacker_Albert    202 linux 启动流程module加载 1.启动过程分为三个部分 BIOS 上电自检&#xff08;POST&#xff09;引导装载程序 (GRUB2)内核初始化启动 systemd&#xff0c;其是所有进程之父。 1.1.BIOS 上电自检&#xff08;POST&#xff09; BIOS stands for…

【六袆 - Framework】vue3入门;vue框架的特点矩阵列举;Vue.js 工作原理

vue框架的特点 Vue.js的特点展开叙述Vue.js的工作原理展开叙述 官方文档&#xff1a; https://cn.vuejs.org/guide/introduction.html Vue.js的特点 ┌────────────────────┬────────────────────────────────────…

IP地址的四大类型:动态IP、固定IP、实体IP、虚拟IP的区别与应用

在网络通信中&#xff0c;IP地址是设备在互联网上唯一标识的关键元素。动态IP、固定IP、实体IP和虚拟IP是四种不同类型的IP地址&#xff0c;它们各自具有独特的特点和应用场景。 1. 动态IP地址&#xff1a; 动态IP地址是由Internet Service Provider&#xff08;ISP&#xff…

极智一周 | NVIDA软件生态、CUDA、TensorRT、cuDNN、DeepStream、戴口罩检测、美光晋华、帕美苏米 And so on

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多技术分享 大家好&#xff0c;我是极智视界&#xff0c;带来本周的 [极智一周]&#xff0c;关键词&#xff1a;NVIDIA软件生态、CUDA、TensorRT、cuDNN、DeepStream、戴口罩检测、美光晋华、帕美苏米 And so on。 邀您加…

React Hooks 面试题 | 06.精选React Hooks面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

初识隧道代理HTTP:理解基础概念的重要性

嗨&#xff0c;小伙伴们&#xff01;如果你对网络世界充满好奇&#xff0c;那么这篇文章就是为你准备的。我们将一起踏上一段奇妙的旅程&#xff0c;探索一个叫做“隧道代理HTTP”的新领域。但在这之前&#xff0c;我们需要先穿上“基础概念”的防护服&#xff0c;以免被这个复…

jQuery日历签到插件下载

jQuery日历签到插件下载-遇见你与你分享