序列每天从0开始_【算法打卡】分割数组为连续子序列

1174c101a88ae20bf43c777be49c153c.png

难度:中等

题目:

    给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个长度为 3 的子序列,其中每个子序列都由连续整数组成。

    如果可以完成上述分割,则返回 true ;否则,返回 false 。

dead77c49702b154909ca2b3e29f3ad4.png

------------------------------------------------------

思考:

    题目要求,把数组分割成一或多个连续的子串,那就是要把尽可能多的数字弄成子串,看着有点像可以贪心

    如果用贪心的话,例如实例2,先尽可能多的从1开始把12345排成一个子序列,然后剩下345排成另一个子序列。

    诶好像可以

    但是到了示例1这种就8行了。先拿出12345,然后就会只剩下3,不成立,但其实他却是成立的。

    其实,上面解释这种只是普通的一般的贪心,我们可以改变一下,升级一下,非一般的贪心

    一个一个地贪心。   

思路:

  • 先用两个hashMap,一个countNum用来记录数字出现次数,一个tail记录以每个数字num结尾的子序列数。

  • 然后遍历数组,从头开始,

  • 先判断countNum的对应数字(例如X)数量是否>0,如果是则再去查找有没有以数字X-1为结尾的子X序列,有则把数字X续上,tail的X-1结尾的序列数量-1,X结尾的+1,countNum中的X数量-1。

  • 继续判断下一位。

  • 如果全部都能连上就是成功。否则有一个不能连上就是失败。

以示例1来说,

    首先看1,先去countNum查找1的数量,如果>0个,则再去查找tail。如果有以1前一位(也就是0)结尾的,就在后面再续上,然后countNum的num的对应数量-1,tail的前一位的数量-1,1结尾的+1;如果tail没有以前一位结尾话,就去看后两位,2和3的countNum是不是同时>0,如果是则连成子串,对应的123的countNum-1tail对应的3数量+1

    然后看2,因为上面123连成了,123都-1,countNum的2数量=0.

    再看3,上面减了1,countNum的3数量为1,同样查找tail,没有以前一位(2)结尾的,直接查看后两位,有,连成子序列345,countNum各个数-1,tail为5的+1

    最后都可以连上,成功。

代码:

public boolean isPossible(int[] nums) {    // 用一个哈希表统计每个数字出现的次数    Map countNum = new HashMap<>();    for (int num : nums) countNum.put(num, countNum.getOrDefault(num, 0) + 1);    // 定义一个哈希表记录最长的子序列    Map tail = new HashMap<>();    for (int num : nums) {        int count = countNum.getOrDefault(num, 0);        if (count <= 0) {//当前元素已经用完,直接跳过            continue;        } else if (tail.getOrDefault(num - 1, 0) > 0) {//前面还有数字,可以构成以num结尾的子序列            countNum.put(num, count - 1);            tail.put(num - 1, tail.get(num - 1) - 1);//覆盖当前最长的子序列            tail.put(num, tail.getOrDefault(num, 0) + 1);//当前以num结尾的子序列+1        } else if (countNum.getOrDefault(num + 1, 0) > 0 && countNum.getOrDefault(num + 2, 0) > 0) {//前面无数字构成子序列后,判断能不能跟后面的构成子序列            countNum.put(num, count - 1);            countNum.put(num + 1, countNum.get(num + 1) - 1);            countNum.put(num + 2, countNum.get(num + 2) - 1);            tail.put(num + 2, tail.getOrDefault(num + 2, 0) + 1);//当前以num+2结尾的子序列+1        } else            return false;//前后不能构成子序列则不成立    }    return true;}

时间复杂度:两个独立的循环,一个记录各个数字个数,一个遍历数字情况。所以是O(n)

空间复杂度:两个独立的哈希表存储数字个数和子序列数,所以是O(n)

----------------------------------完--------------------------------

淦里良欸

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

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

相关文章

linux中 /dev/null命令

/dev/null &#xff1a;代表空设备文件 > &#xff1a;代表重定向到哪里&#xff0c;例如&#xff1a;echo "123" > /home/123.txt1 &#xff1a;表示stdout标准输出&#xff0c;系统默认值是1&#xff0c;所以">/dev/null"等同于"1>/d…

php会员系统源码_b2b2c商城系统会员预存款架构及源码分享

业务需求可以为预存款充值&#xff0c;在支付订单时使用预存款支付功能当预存款余额>商品订单总金额时&#xff0c;完全抵扣商品订单金额&#xff1b;当预存款余额架构一、 充值二、 数据结构1、会员钱包表(es_member_wallet)2、 后期可能会将会员积分等关于消费抵扣相关信息…

mongodb 去重查询 Java,mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句...

另外附上mongodb eclipse插件地址&#xff1a; http://www.jumperz.net/update/ import java.net.UnknownHostException;import com.mongodb.DB;import com.mongodb.DBCol1.首先操作mongodb最基本命令&#xff1a;:show databases; ---------------------显示全部数…

HTML5 规范

在学习编程的时候&#xff0c;每次看到那些整齐规范的代码&#xff0c;心里顿时对这个程序员表示点点好感&#xff0c;有时&#xff0c;比如看到自己和朋友写的代码时&#xff0c;那阅读起来就是苦不堪言&#xff0c;所以&#xff0c;一些基本的开发规范是必须的&#xff0c;是…

python提交事务_事务提交和回滚

操作方法begin; -开始事物commit; - 提交事物 Python 默认是取消自动提交的rollback; - 回撤操作, 只要操作没有执行 commit 就可以进行回滚操作, 撤回create table tb_account(accid char(4) not null,uname varchar(20) not null,balance float default 0)insert into tb_ac…

求数组的最大值php,求PHP数组最大值,最小值的代码

求PHP数组最大值,最小值的代码&#xff0c;需要的朋友可以参考下。代码如下:$fruits array("155::vbscript::http://www.jb51.net/list/list_114_1.htm", "1::javascript::http://www.jb51.net/list/list_3_1.htm", "2::正则表达式::http://www.jb51…

JWT.NET的使用

JWT.NET的使用 原文:JWT.NET的使用JWT是什么 JWT全称是Json Web Token&#xff0c;是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准&#xff08; RFC 7519 &#xff09;&#xff0c;定义了一种简洁的&#xff0c;自包含的方法用于通信…

正在搜索需要的文件_【数澜发布-澜寻】智能内容搜索引擎,释放“机器阅读” 潜力...

4月23日&#xff0c;又是一年世界读书日。知识传播的重要性在这一天被无数次提起&#xff0c;记录、阅读成为我们 “理解”这个世界的加速通道&#xff0c;但在科技力量迅猛发展的当下&#xff0c;阅读这件事早已不再局限于人类。人工智能应用到社会中很重要的一步就是模仿人类…

学习笔记(十一)——数据库的索引碎片、计划缓存、统计信息

1.索引碎片 数据库存储本身是无序的&#xff0c;建立了聚集索引&#xff0c;会按照聚集索引物理顺序存入硬盘。既键值的逻辑顺序决定了表中相应行的物理顺序 而且在大多数的情况下&#xff0c;数据库写入频率远低于读取频率&#xff0c;索引的存在为了读取速度牺牲写入速度&…

网络软文发布软件_星浪中合网软文写出爆款汽车营销软文的特点是什么?

在移动互联网快速发展的时代&#xff0c;人们都是使用移动设备来获取外界信息。过去&#xff0c;许多广告汽车公司都专注于线下广告&#xff0c;但是现在他们已经将广告费用投入了移动互联网市场。移动互联网营销方法很多&#xff0c;例如&#xff0c;软文营销是一种非常强大的…

通达oa wbupload.php,关于通达OA上传附件类型限制的设置

关于上传附件类型限制的设置有些用户在使用OA系统的过程中&#xff0c;要求只允许上传比如后缀名为doc&#xff0c;xls&#xff0c;ppt等的附件文件。如何设置才能实现这一点呢&#xff1f;下面简单介绍下设置方法。1、在该路径MYOA\webroot\inc下找到配置文件oa_config.php文件…

JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...

说明&#xff1a;本文为作者原创&#xff0c;作者联系地址为&#xff1a;josserchaiyahoo.com。由于Java编程中的中文问题是一个老生常谈的问题&#xff0c;在阅读了许多关于Java中文问题解决方法之后&#xff0c;结合作者的编程实践&#xff0c;我发现过去谈的许多方法都不能清…

ADC应用

数模转换&#xff08;ADC&#xff09;的应用笔记 智能时代&#xff0c;数字信号已体现在我们生活的方方面面&#xff0c;A/D,D/A是重要的基础。智能手机触摸信号需要转换为数字信号才能分辨触摸位置、数字去抖&#xff1b;打电话或者麦克风需要将模拟声信号转换为数字信号以便存…

springboot 禁用tomcat_Spring Boot 面试的十个问题

点击左上角蓝字&#xff0c;关注“SpringForAll社区”专注分享Spring周边技术内容用下面这些常见的面试问题为下一次 Spring Boot 面试做准备。在本文中&#xff0c;我们将讨论 Spring boot 中最常见的10个面试问题。现在&#xff0c;在就业市场上&#xff0c;这些问题有点棘手…

java oracle数据库连接代码,java连接oracle数据库代码实例(注释详解)

import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class GetOracleConnection{/** Oracle数据库连接URL*/private final static String DB_URL "jdbc:oracle:thin:1…

javascript总for of和for in的区别?

for in是ES5标准,for of是ES6标准; for in是遍历对象属性,for of是遍历对象元素。 for of兼容性还不够,移动端安卓微信浏览器貌似不支持&#xff0c;苹果的可以;web端IE支持也不够&#xff0c;chrome可以。 先说结论&#xff1a; 推荐在循环对象属性的时候&#xff0c;使用for.…

go 怎么等待所有的协程完成_理解真实世界中 Go 的并发 BUG

点击上方蓝色“Go语言中文网”关注&#xff0c;回复「电子书」领全套Go资料有几个学生研究归纳了go编程中的并发bugs&#xff0c;发表了一篇(英文)论文&#xff1a;《Understanding Real-World Concurrency Bugs in Go》。为你下载好了 PDF&#xff0c;关注公众号 Go语言中文网…

java地图图表动态亮点,可视化图表行动指南:地表最强解读来了

原标题&#xff1a;可视化图表行动指南&#xff1a;地表最强解读来了身处信息技术高速发展的时代&#xff0c;数据价值日益凸显&#xff0c;然而如何将数据更好的展示&#xff0c;让别人一看就懂且眼前一亮可是一门大学问。此前&#xff0c;小亿在广大数友的强烈要求下结合前人…

matlab cell向量匹配向量,根据2个cell格式数据中的某二列进行匹配并合并

clear allacell(9,4); % a中的第1列为样本id, 第3列为日期bcell(6,3); % b中的第1列为样本id, 第3列为日期我想根据a中的第1列对应样本id和第3列对应日期与b中的第1列对应id和第3列对应日期进行匹配合并。a{1,1}name1;a{1,2}37; a{1,3}2010/9/1; a{1,4}4.5;a{2,1}name1…

python tfidf特征变换_Spark MLlib机器学习开发指南(4)--特征提取--TF-IDF

基于最新2.2.0版本翻译本节介绍和特征一起工作的算法&#xff0c;大致分为以下几类&#xff1a;提取&#xff1a;从原始数据提取特征转换&#xff1a;缩放&#xff0c;转换&#xff0c;或者修改特征选择&#xff1a;从一个大的特征集合里面选择一个子集局部敏感哈希(LSH)&#…