难度:中等

题目:

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

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

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

思考:

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

如果用贪心的话,例如实例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)

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

淦里良欸

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

  1. leetcode 659. 分割数组为连续子序列(贪心算法)

    给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 . 如果可以完成上述分割,则返回 true :否则,返回 f ...

  2. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /**************************************** copyright@hustyangju * blog: http://blog.csdn.n ...

  3. 序列每天从0开始_序列比对(十一)——计算符号序列的全概率

    前文介绍了在知道符号序列后用viterbi算法求解最可能路径.本文介绍了如何使用前向算法和后向算法计算符号序列的全概率. 如果一个符号序列中每个符号所对应的状态是已知的,那么这个符号序列出现的概率是容 ...

  4. python中属于无序序列的有_Python字典和集合属于无序序列。(2.0分)_学小易找答案...

    [单选题]某公司成立十年来,每年都要组织公司学习公司创始人创办初期事迹的活动,以提炼升华公司精神,这种组织员工学习文化的做法,利用的是( )? [判断题]元组没有append().remove()等方 ...

  5. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  6. 分解连续自然数的和_[算法]正整数分解为几个连续自然数之和

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  7. java最长回文子序列_算法--字符串:最长回文子序列

    转自:labuladong公众号 子序列问题是常见的算法问题,而且并不好解决. 首先,子序列问题本身就相对子串.子数组更困难一些,因为前者是不连续的序列,而后两者是连续的,就算穷举都不容易,更别说求解 ...

  8. python 正整数 连续多个数之和_[算法]正整数分解为几个连续自然数之和

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  9. asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

最新文章

  1. [Android]为指定的应用创建桌面快捷方式
  2. MapReduce基础开发之十二ChainMapper和ChainReducer使用
  3. Ubuntu16.04 LTS安装配置安装CUDA8.0、CUDNN5.1
  4. 第四章-数据共享与保护
  5. 这个功能是怎么实现的
  6. HTTP头域列表与解释 之 request篇
  7. 代码行数越少就越“简单”吗?
  8. 【ctf-3】数论基础+Crypto初步
  9. android中桌面倒计时,android 倒计时显示
  10. 两数互素有什么性质_两个数互质是什么意思 判断互质数的方法有哪些
  11. 渗透测试之信息收集总结
  12. 打印模板-Zebra指令
  13. x264源代码简单分析 编码器主干部分-1
  14. NIST加密标准是什么意思?
  15. 在VMware虚拟机软件下如何给一个CentOS7虚拟机添加多个网卡
  16. 修改falcon的钉钉告警格式
  17. ArcGIS中城镇建设指向的灾害评价(地震)
  18. 产品01-产品经理初步认知
  19. 区块链技术介绍----分布式总帐
  20. 3dmax2021 中的各种显示相关如何设置?

热门文章

  1. 基于javaweb(springboot+mybatis)宠物医院预约管理系统设计和实现
  2. chrome 代理插件_Chrome浏览器拓展插件同步助手
  3. linux+硬盘rd5,Raid磁盘阵列
  4. 35岁学嵌入式合适吗_什么是嵌入式技术?
  5. php基础学哪些,榆林学习php需要哪些基础(PHP是什么)
  6. Pycharm最新版本安装教程
  7. 绘制彩虹html代码,HTML5 Canvas 彩虹螺旋图生成器
  8. 【youcans 的 OpenCV 例程 200 篇】102. 陷波带阻滤波器的传递函数
  9. 坯子库曲面推拉教程_一招曲面流动,搞定99%异形建模
  10. mysql数据变化通通知机制_深入理解Notification机制