7.10非递减子序列(LC491-M)

算法:

在90.子集II (opens new window)中我们是通过排序,再去重来达到去重的目的。

而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。

肯定还是回溯算法。

画树:

树里面其实有两个注意点:

(1)每个子集中,所取元素应该大于等于前一个元素

(2)同一层树下,不能取重复的元素来制作子集

回溯三部曲:

1.确定返回值和参数

返回值:void

参数:

int[] nums(题目给出)

int startIndex:需要startIndex,调整下一层递归的起始位置。

2.确定终止条件

本题其实类似求子集问题,也是要遍历树形结构找每一个节点,所以和回溯算法:求子集问题! (opens new window)一样,可以不加终止条件(求子集时为了便于理解,终止条件是startindex >= nums.length,但其实这个终止条件可以不加),startIndex每次都会加1,并不会无限递归。

但本题收集结果有所不同,题目要求递增子序列大小至少为2。

if (path.length > 1) {result.add(path);// 注意这里不要加return,因为要取树上的所有节点
}

3.单层递归逻辑

其实就是注意点,当出现以下情况时,continue,跳出for循环

(1)每个子集中,所取元素应该大于等于前一个元素

(2)同一层树下,不能取重复的元素来制作子集

具体实现时,要用一个数组来进行去重操作,题目说数值范围[-100, 100]

将用过的值插入数组,表示这个元素在本层用过了,本层后面不能再用了

(为什么用数组?

若用集合,程序运行的时候对集合频繁的insert,集合需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且每次重新定义set,insert的时候其底层的符号表也要做相应的扩充,也是费事的。)

把nums[i]加入path

递归

回溯:把刚刚加入的nums[i]弹出

调试过程

第一次调试:

class Solution {//两个全局变量List<List<Integer>> result = new LinkedList<>();List<Integer> path = new LinkedList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums, 0);return result;}void backtracking (int[] nums, int startindex) {//确定终止条件,收集结果if (startindex >= nums.length) {result.add (new LinkedList(path));return;}//单层递归逻辑for (int i=startindex; i <= nums.length; i++){//题目中说:-100 <= nums[i] <= 100,说明nums的最大长度为201//为了确保所有数字都能被记录,去重数组的长度被设置为 201int[] used = new int[201];/*跳出循环的条件:(1)nums[i]<当前path中的最后一个值,前提是path非空注意:这里不是nums[i]<nums[i-1],因为nums本身无序,而path有序(2)nums[i]的值和该层前面的值重复了:每用过一次,就让该值在used中对应索引的位置(used[nums[i]+100]==1)为1,因为-100 <= nums[i] <= 100,为了得到合法的索引(>=0),used中nums对应的索引为used[nums[i]+100]若在循环中发现used中该值为1,说明重复了*/if (!path.emphty() && nums[i]<path.get(path.size()-1) || used[nums[i]+100]==1) continue;used[nums[i]+100]=1;//标记用过的值path.add(nums[i]);//递归backtracking(nums, i+1);//回溯path.removeLast();}}
}

原因:

java中判断(is)非空(Empty)的函数为:isEmpty()

isEmpty()

我写得不对。

另外,used数组是记录每层是否使用重复元素的,应该放在for循环外面

第二次调试:

原因:

问题在终止条件上,索引是从0-nums.length-1,

        所以for循环终止条件应该为 i < nums.length

另外,

        收集结果时不要return,因为要取树上的所有节点,而不是叶子节点

正确代码:

class Solution {//两个全局变量List<List<Integer>> result = new LinkedList<>();List<Integer> path = new LinkedList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums, 0);return result;}void backtracking (int[] nums, int startindex) {//确定终止条件,收集结果if (path.size() > 1) {result.add (new LinkedList(path));}//单层递归逻辑//题目中说:-100 <= nums[i] <= 100,说明nums的最大长度为201//为了确保所有数字都能被记录,去重数组的长度被设置为 201int[] used = new int[201];for (int i=startindex; i < nums.length; i++){/*跳出循环的条件:(1)nums[i]<当前path中的最后一个值,前提是path非空注意:这里不是nums[i]<nums[i-1],因为nums本身无序,而path有序(2)nums[i]的值和该层前面的值重复了:每用过一次,就让该值在used中对应索引的位置(used[nums[i]+100]==1)为1,因为-100 <= nums[i] <= 100,为了得到合法的索引(>=0),used中nums对应的索引为used[nums[i]+100]若在循环中发现used中该值为1,说明重复了*/if (!path.isEmpty() && nums[i] < path.get(path.size()-1) || used[nums[i]+100]==1) continue;used[nums[i]+100]=1;//标记用过的值path.add(nums[i]);//递归backtracking(nums, i+1);//回溯path.removeLast();}}
}

时间空间复杂度:

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

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

相关文章

[python]python利用pyaudio录制系统声音没有立体声混音怎么录制系统音频

当电脑没有立体声混音导致Python写代码无法使用pyaudio进行录制系统声音怎么办&#xff1f;查阅资料和安装驱动等方法都不行&#xff0c;难道没办法了吗&#xff1f;那为什么电脑其他软件可以做到呢&#xff1f;因此研究了一下pyaudio在没有立体声混音情况下确实无法录制声音&a…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

Android Matrix画布Canvas旋转Rotate,Kotlin

Android Matrix画布Canvas旋转Rotate&#xff0c;Kotlin private fun f1() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.…

软件开发新手用哪个IDE比较好?软件开发最好的IDE都在这!

目录 IDES 的优点 最佳编程 IDE 列表 Java 开发的流行集成开发环境 JetBrains 的 IntelliJ IDEA NetBeans 适用于 C/ C、C# 编程语言的最佳 IDE Visual Studio 和 Visual Studio 代码 Eclipse PHP 开发的最佳 IDE PHPStorm Sublime Text Atom JavaScript 的顶级 I…

Python:正则表达式速通,码上上手!

1前言 正则表达式&#xff08;Regular Expression&#xff09;是一种用来描述字符串模式的表达式。它是一种强大的文本匹配工具&#xff0c;可以用来搜索、替换和提取符合特定模式的文本。 正则表达式由普通字符&#xff08;例如字母、数字、符号等&#xff09;和元字符&#…

2023 AI开发者生态报告

随着人工智能技术的飞速发展&#xff0c;全球IT市场对AI的投入持续增长&#xff0c;预计到2027年将达到4236亿美元。中国作为AI领域的重要参与者&#xff0c;其投资规模预计将占全球的9%。在这样的背景下&#xff0c;2023年的《AI开发者生态报告》为我们揭示了人工智能时代的技…

Linux的账号及权限管理

一.管理用户账号 1.1 用户账户的分类 1.1.1 用户账号的分类 超级用户&#xff1a;&#xff08;拥有至高无上的权利&#xff09; root用户是Linux操作系统中默认的超级用户账号&#xff0c;对本主机拥有最高的权限&#xff0c;系统中超级用户是唯一的。普通用户&#xff1a; …

centos7.9 TCP 加速

BBR是谷歌开发的新的TCP加速算法&#xff0c;在网络状况不好的服务器上开启TCP的bbr&#xff0c;可以在无需增加任何硬件投入的情况下实现网络加速&#xff0c;并且客户端无需做任何配置&#xff0c;因此使用起来非常的方便。TCP加速对网络状况较好的内网环境&#xff0c;或者大…

Mysql高阶语句及存储过程

目录 空值(NULL) 和 无值() 的区别&#xff1a; 正则表达式&#xff1a; 存储过程&#xff1a; 创建存储过程&#xff1a; 存储过程的参数&#xff1a; 存储过程的控制语句&#xff1a; mysql高阶语句 case是 SQL 用来做为if&#xff0c;then&#xff0c;else 之类逻辑的…

Vue学习计划-Vue3--初识Vue3,vite创建Vue3项目

1. Vue3简介 性能的提升 打包大小减少41%初次渲染快55%&#xff0c;更新渲染快133%内存减少54% 源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking 拥抱TypeScript Vue3可以更好的支持TypeScript 新的特性 Composition Api(组合Api) setupref…

【零基础入门VUE】在 Vue 中构建复杂表单

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 目录 v-modelVue 中的 指令 Vue 中的组件 没有构建步骤 随着构建步骤 注册 VUE 组件 Vue 道具 VUE 中的道具声明 在 VUE 中传递 PROP…

CSP CCF 201409-2 画图 C++满分题解

解题思路&#xff1a; 1.使用二维数组标记每一个方块是否被涂色。 2.注意坐标代表的是点&#xff0c;不是方块&#xff0c;交界处的坐标只能算一个方块。 3.可以看成&#xff1a;每一个坐标都对应它左上角的一个小方块&#xff0c;这样可以避免重复计算方块数 #include<i…

Unity中URP下精度修饰符real

文章目录 前言一、real是什么&#xff1f;1、我们在项目的Packages下找到如下文件&#xff1a;2、HAS_HALF(1代表有half精度&#xff0c;0代表没有half精度)3、PREFER_HALF4、REAL_IS_HALF5、如果 real is half6、否则为float 二、总结 前言 在使用雾效时&#xff0c;ComputeFo…

你好,2024!

大家好&#xff0c;我是南城余&#xff01; 今天是2023年最后一天&#xff0c;看到各位大佬都在分享今年的总结&#xff0c;我也来做个年度总结&#xff0c;是第一次做年度总结&#xff0c;希望以后可以每年都做一个好好的回顾。 NO1. 再见&#xff0c;大学&#xff01; 1 2…

ThinkPad T14s Gen3,ThinkPad X13 Gen3(21BS,21BQ,21BR,21BN)原装出厂Win11系统

lenovo联想ThinkPad系列T14s/X13 Gen3笔记本电脑原装Windows11预装OEM系统镜像 链接&#xff1a;https://pan.baidu.com/s/1yhRMIjlkFvt86aLioOoNOA?pwdfrsp 提取码&#xff1a;frsp 原厂系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、联想…

竞赛保研 基于机器视觉的12306验证码识别

文章目录 0 简介1 数据收集2 识别过程3 网络构建4 数据读取5 模型训练6 加入Dropout层7 数据增强8 迁移学习9 结果9 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的12306验证码识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向…

rosdep init/update失败(转载)

sudo rosdep init rosdep update 如果你直接成功了&#xff0c;可直接跳过当我没说&#xff08;不过90%的几率你都会失败的啦&#xff09; 由于http://raw.githubusercontent.com这个网址墙的很厉害&#xff0c;大概率你是成功不了的&#xff0c;这里推荐一种本地化安装的方法…

【Leetcode】1154. 一年中的第几天

文章目录 题目思路代码 题目 1154. 一年中的第几天链接 思路 题目要求是给定一个字符串 date&#xff0c;它代表一个日期&#xff0c;采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。 首先&#xff0c;我们可以通过字符串的索引来提取年、月和日的数值&…

二维动态规划问题,python解决最长回文子串

一个算法中的经典问题&#xff0c;求最长回文子串问题&#xff0c;其实是可以归于二维动态规划问题。 对于给定的一个字符串中&#xff0c;找到这个字符串中的回文子串&#xff0c;回文子串的概念是从前往后正向的读和从后往前反向的读都是完全相同的字符串。 对这个问题进行…

el-date-picker周选择器获取选择的日期范围

<el-date-pickerv-model"formData.date"type"week"format"yyyy 第 WW 周"placeholder"选择周"change"weekChange"> </el-date-picker>// 方法一&#xff1a;weekChange(val) {let startTime new Date(val.getT…