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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

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

问题分析:

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

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

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

     //测试中发现nums元素值都在正负10000以内
public boolean isPossible(int[] nums) {
int[] counts = new int[20000];
int[] need = new int[20000]; for (int i = 0; i < nums.length; i ++) {
//将所有负数转为正数
nums[i] += 10000;
counts[nums[i]] ++;
} for (int n : nums) {
if (counts[n] == 0) continue; if (need[n] > 0){
need[n] --;
need[n + 1] ++;
} else if (counts[n + 1] > 0 && counts[n + 2] > 0){
counts[n + 1] --;
counts[n + 2] --;
need[n + 3] ++;
} else return false;
counts[n] --;
}
return true;
}

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学习---Model拾遗[1]180318

    Model: 强大的数据库操作,弱小的数据验证 Form:  强大的数据验证 ModelForm: 强大的数据验证 + 弱小的数据库操作 Model拾遗 Model基本操作 1. 创建数据库表2. 修 ...

  2. HBase编程 API入门系列之create(管理端而言)(8)

    大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门系列之put(客户端而言)(1) 就知道,在这篇博文里,我是在HBase Shell里创建HBase表的. 这里,我带领大家,学习更高 ...

  3. iOS自动化-- 常用iOS命令

    iOS命令: 获取设备的的UDID idevice_id --list # 显示当前所连接设备的 udid instruments -s devices # 列出所有设备,包括真机.模拟器.mac i ...

  4. HTTP协议图--HTTP 报文首部之请求行、状态行

    1.请求行 举个栗子,下面是一个 HTTP 请求的报文: GET /index.htm HTTP/1.1 Host: sample.com 其中,下面的这行就是请求行, GET /index.htm ...

  5. web自动化_浏览器驱动chromedriver安装方法(适用RF框架/Selenium/Appium)

    在进行UI自动化时,打开浏览器是第一步,这就必须要安装浏览器的驱动,chrome浏览器需要安装chromedriver,下载地址:http://chromedriver.storage.googlea ...

  6. Java并发案例04---生产者消费者问题03--使用ReentrantLock

    /** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用wait和notify/notif ...

  7. BZOJ2223/3524:[POI2014] Couriers(主席树)

    Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0 ...

  8. controller中的路径明明书写正确,浏览器中访问的url也拼接正确,但报404

    Bug:controller中的路径明明书写正确,浏览器中访问的url也拼接正确,但报404 原因一:由于路由地址对应的处理方法存在同名而造成的,此时应该检查controller的方法们,看看有没有同 ...

  9. Appium基础篇(一)——启动emulator

    1. Appium API文档:链接参考 http://appium.io/slate/cn/v/?ruby#appium-介绍. 2. Appium 安装篇:http://www.cnblogs.c ...

  10. 关于IntelliJ IDEA 文档无法编辑的解决办法

    问题:在调试的时候,光标无法聚焦到代码区,导致无法编辑代码.停止调试后,问题仍然存在,需要重启idea. 这个问题纠结了我一个上午,百狗一通,发现都是说要卸载vim插件啥的,但是我是没装过vim插件. ...