序列每天从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,一经查实,立即删除!

相关文章

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

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

HTML5 规范

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

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文件…

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;这些问题有点棘手…

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;小亿在广大数友的强烈要求下结合前人…

ASP.NET MVC 使用Swagger需要注意的问题!!!

之前&#xff0c;一直使用的微软自带的Microsoft.AspNet.WebApi.HelpPage来作为项目的接口文档&#xff0c;但总感觉有些不足&#xff0c;就准备采用Swagger。 在项目中引用Swagger很方便&#xff0c;直接Nuget搜索安装Swashbuckle就可以。但是&#xff0c;在使用的过程中&…

分块试水--CODEVS4927 线段树练习5

模板 1 #include<stdio.h>2 #include<algorithm>3 #include<string.h>4 #include<stdlib.h>5 #include<math.h>6 //#include<bitset>7 //#include<iostream>8 using namespace std;9 10 int n,m,q;11 #define maxn 10001112 #define…

【JVM】类的生命周期【转+整理】

参考如下三篇并整理。 1.Java类加载机制详解 2.深入理解Java&#xff1a;类加载机制及反射 3.jvm系列(一):java类的加载机制 类的生命周期是从被加载到虚拟机内存中开始&#xff0c;到卸载出内存结束。过程共有七个阶段。 1.加载---2.验证---3.准备---3.解析---5.初始化---6.使…

java概念,Java基础概念

1. Java编译程序将Java源程序翻译成JVM可执行代码-Java字节码。这一过程同C/C不同。当C编译器翻译成一个对象代码时&#xff0c;该代码是为在某一特定硬件平台运行而产生的。因此&#xff0c;在编译过程中&#xff0c;编译程序通过查表将所有符合引用转换为特定的内存偏移量。而…

【Excle】如何隐藏数据透视表中的错误值

如下&#xff1a;数据透视表出现错误怎么解决呢步骤方法①单击数据透视表任意单元格→数据透视表工具→分析→选项→勾选“对于错误值显示”→确定方法②右键→数据透视表选项&#xff08;同样可以修改&#xff09;转载于:https://www.cnblogs.com/OliverQin/p/8043469.html

repo同步代码_工欲善其事,必先利其器:repo 介绍

介绍此repo非彼repo。这里的repo&#xff0c;是指谷歌公司的一款小工具&#xff0c;名字就叫repo(我承认&#xff0c;这不是一个好名字&#xff0c;Google里面怎么搜都搜不到它的真身)。解决的问题有时候&#xff0c;我们需要在一台电脑上克隆很多个代码仓库&#xff0c;编译它…

ddd 企业应用架构模式_灵魂拷问:用了DDD分包就是落地了领域驱动设计吗?谈谈DDD本质...

学习DDD的时候&#xff0c;作为开发&#xff0c;我们更关心它在技术层面的东西&#xff0c;尤其体现在DDD的分包方式、编码技巧等方面。自然的&#xff0c;我们不禁发问&#xff0c;用了DDD的分包&#xff0c;就是实践落地了DDD了么&#xff1f;不卖关子&#xff0c;直接说答案…

java常见编码

摘自&#xff1a;http://www.cnblogs.com/yaya-yaya/p/5768616.html红色 主要点  灰色 内容 绿色 知识点 橘色 补充内容几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题&#xff0c;那就是为什么要编码&#xff1f;我们能不能不编码&#xff1f;要…

准确率 召回率_机器学习中F值(F-Measure)、准确率(Precision)、召回率(Recall)

在机器学习、数据挖掘、推荐系统完成建模之后&#xff0c;需要对模型的效果做评价。业内目前常常采用的评价指标有准确率(Precision)、召回率(Recall)、F值(F-Measure)等&#xff0c;下图是不同机器学习算法的评价指标。下文讲对其中某些指标做简要介绍。本文针对二元分类器&am…