659. 分割数组为连续子序列

输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数。返回你是否能做出这样的分割?

示例 1:

  1. 输入: [1,2,3,3,4,5]
  2. 输出: True
  3. 解释:
  4. 你可以分割出这样两个连续子序列 :
  5. 1, 2, 3
  6. 3, 4, 5

示例 2:

  1. 输入: [1,2,3,3,4,4,5,5]
  2. 输出: True
  3. 解释:
  4. 你可以分割出这样两个连续子序列 :
  5. 1, 2, 3, 4, 5
  6. 3, 4, 5

示例 3:

  1. 输入: [1,2,3,4,4,5]
  2. 输出: False

提示:

  1. 输入的数组长度范围为 [1, 10000]

************************************************************

问题分析:

  • 采用链表freq保存数组元素对应个数
  • 采用need用来判断当前元素是否能够插入到一个已经构建好的序列末端
  1. public boolean isPossible(int[] nums) {
  2. //数组中每个元素与出现次数的对应关系
  3. Map<Integer, Integer> freq = new HashMap<>();
  4. Map<Integer, Integer> need = new HashMap<>();
  5.  
  6. for (int n : nums) freq.put(n, freq.getOrDefault(n, 0) + 1);
  7.  
  8. for (int n: nums) {
  9. if (freq.getOrDefault(n, 0) == 0) continue;
  10.  
  11. if (need.getOrDefault(n, 0) > 0){
  12. need.put(n, need.get(n) - 1);
  13. need.put(n + 1, need.getOrDefault(n + 1, 0) + 1);
  14. } else if (freq.getOrDefault(n + 1, 0) > 0 && freq.getOrDefault(n + 2, 0) > 0){
  15. freq.put(n +1, freq.get(n + 1) - 1);
  16. freq.put(n + 2, freq.get(n + 2) - 1);
  17. need.put(n + 3, need.getOrDefault(n + 3, 0) + 1);
  18. } else return false;
  19. freq.put(n, freq.get(n) - 1);
  20. }
  21.  
  22. return true;
  23. }

参考链接:https://blog.csdn.net/LaputaFallen/article/details/80034863

在测试时,发现有些条件题目没有给出提示,比如所有nums数组中的元素值大小都在±10000以内,所以也可以基于数组的形式完成,并且效率更高!

  1. //测试中发现nums元素值都在正负10000以内
  2. public boolean isPossible(int[] nums) {
  3. int[] counts = new int[20000];
  4. int[] need = new int[20000];
  5.  
  6. for (int i = 0; i < nums.length; i ++) {
  7. //将所有负数转为正数
  8. nums[i] += 10000;
  9. counts[nums[i]] ++;
  10. }
  11.  
  12. for (int n : nums) {
  13. if (counts[n] == 0) continue;
  14.  
  15. if (need[n] > 0){
  16. need[n] --;
  17. need[n + 1] ++;
  18. } else if (counts[n + 1] > 0 && counts[n + 2] > 0){
  19. counts[n + 1] --;
  20. counts[n + 2] --;
  21. need[n + 3] ++;
  22. } else return false;
  23. counts[n] --;
  24. }
  25. return true;
  26. }

LeetCode——数组篇:659. 分割数组为连续子序列的更多相关文章

  1. Java实现 LeetCode 659 分割数组为连续子序列 (哈希)

    659. 分割数组为连续子序列 输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数.返回你是否能做出这样的分割? 示例 1: 输入: [ ...

  2. Leetcode 659.分割数组为连续子序列

    分割数组为连续子序列 输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数.返回你是否能做出这样的分割? 示例 1: 输入: [1,2,3 ...

  3. js算法之把一个数组按照指定的数组大小分割成若干个数组块

    题目描述:     把一个数组arr按照指定的数组大小size分割成若干个数组块. 例如:   chunk([1,2,3,4],2)=[[1,2],[3,4]];   chunk([1,2,3,4,5 ...

  4. lintcode :最长上升连续子序列

    题目: 最长上升连续子序列 给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列.(最长上升连续子序列可以定义为从右到左或从左到右的序列.) 样例 ...

  5. lintcode-397-最长上升连续子序列

    397-最长上升连续子序列 给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列.(最长上升连续子序列可以定义为从右到左或从左到右的序列.) 注意事 ...

  6. lintcode_397_最长上升连续子序列

    最长上升连续子序列   描述 笔记 数据 评测 给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列.(最长上升连续子序列可以定义为从右到左或从左到 ...

  7. 连续子序列的最大和 牛客网 剑指Offer

    连续子序列的最大和 牛客网 剑指Offer 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量 ...

  8. [LeetCode] 659. Split Array into Consecutive Subsequences 将数组分割成连续子序列

    You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...

  9. [LeetCode] Split Array into Consecutive Subsequences 将数组分割成连续子序列

    You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...

随机推荐

  1. Python学习---文件操作的学习1208

    1.1. 对文件操作基本操作: 操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 注意:pyton中操作的文件是utf8保存的,打开文件时open函数是通过操作系统 ...

  2. c#listbox使用详解和常见问题解决

    关于ListBox ListBox是WinForm中的 列表 控件,它提供了一个项目列表(一组数据项),用户可以选择一个或者多个条目,当列表项目过多时,ListBox会自动添加滚动条,使用户可以滚动查 ...

  3. LNMP-day3-php扩展缓存插件

     perl的编译问题 [root@localhost php5.6.33]# echo 'export LC_ALL=C' >> /etc/profile #设置环境变量,解决后面perl ...

  4. 深入浅出SharePoint2010——请假系统无代码篇之工作流设计

    使用SharePoint Designer 2010进行设计. 主要使用的Actions如下图所示. 关于权限,考虑到严谨的权限设计,所以所有参与人员均为Read权限. 关于请假天数的计算,请假天数的 ...

  5. 015.4守护线程和join

    内容:守护线程.join方法#####################守护线程通过开启线程之前调用setDaemon()方法,变成后台线程,前台线程运行完,后台线程自动会结束#########例子 c ...

  6. VM安装CentOs7虚拟机后无法上网之解决方法

    最近在研究DC/OS的安装,读了很多安装方法后决定先从docker的安装入手,由于DC/OS的安装必须在CentOs7版本以上,所以就在VM下安装了CentOs7,殊不知安装后并不能上网,于是乎又转到 ...

  7. SOJ 1089 FatMouse的奶酪 暴力

    BackGround FatMouse拥有许多奶酪,所有的奶酪都有一个彼此不同的重量.FatMouse为了控制它自己的体重,在每天早上它都会计算今天应该吃多少奶酪才能无痛苦地减肥. The Probl ...

  8. luogu P2742 【模板】二维凸包

    嘟嘟嘟 没错,我开始学凸包了. 其实挺简单的. 前置技能: 1.极坐标系 2.向量叉积 1.极坐标系 就是一种二维坐标系.只不过两个坐标分别表示向量和极轴的角度和自身的长度.对于不同的问题,极轴可以自 ...

  9. $_cookie的使用

    设置并发送 cookie: <?php $value = "my cookie value"; // 发送一个简单的 cookie setcookie("TestC ...

  10. python中动态导入模块

    当导入的模块不存在时,就会报ImportError错误,为了避免这种错误可以备选其他的模块或者希望优先使用某个模块或包,可以使用try...except...导入模块或包的方式. 例如: Python ...