leetcode659. Split Array into Consecutive Subsequences

题意:

您将获得按升序排列的整数数组(可能包含重复项),您需要将它们拆分成多个子序列,其中每个子序列至少包含3个连续的整数。返回是否可以进行这样的拆分。

思路:

虽然是medium,但是我感觉有点难想= =。 O(n)复杂度。

dp。

先分开各种不同的序列。按如果间隔大于1就坑定是不同的序列。按此分开不同的序列以此简化问题。

然后处理连续的序列。连续的序列false的情况就是没有足够的数字构成连续的序列。

然后转化成一个mp,值为这个数字的个数。

遍历时用一个one记录以此处为end的序列长度为1的序列。用two记录到此处长度为2的序列。因为贪心的缘故。每次的移动后。因为要尽可能完成一个序列,如果此时这个数字的个数 < one + two的个数。说明这个数字是不够完成one,two要构成连续序列的个数的。所以返回False。two就是上一个的one的值。然后one的值,如果比上个数字的个数大,这个数字的个数和上个数字个数的差。但是如果比上个数字小,那就取零。为了方便,用tot来储存上一个数字的个数。tot表示的含义其实就是要构成序列。下一个数字所必须的长度。

ac代码:

C++

class Solution {
public:
bool isPossible(vector<int>& nums) {
int len = nums.size();
int k = 0;
for(int i = 0; i < len; i++)
{
if(i > 0 && nums[i] > nums[i - 1] + 1)
{
if(!check(nums,k,i - 1)) return false;
else k = i;
}
}
return check(nums,k,len - 1);
}
private:
bool check(vector<int>& nums,int s, int e)
{
int n = nums[e] - nums[s] + 1;
vector<int> mp(n,0); for(int i = s; i <= e; i++)
{
mp[nums[i] - nums[s]]++;
} int one, two, tot;
one = two = tot = 0;
for(int i = 0; i < n; i++)
{
if(mp[i] < one + two) return false; two = one;
one = max(0, mp[i] - tot);
tot = mp[i];
}
return one == 0 && two == 0;
}
};

python

class Solution:
def isPossible(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
last = 0
for i , num in enumerate(nums):
if i > 0 and nums[i] > nums[i - 1] + 1:
if self.check(nums, last, i - 1) == False:
return False
else:
last = i
return self.check(nums, last, len(nums) - 1) def check(self, nums, s, e):
mp = []
for i in range(nums[e] - nums[s] + 1):
mp.append(0)
for i in range(s,e + 1):
mp[nums[i] - nums[s]] += 1 one = two = tot = 0 for m in mp:
if m < one + two:
return False
two = one
one = max(0, m - tot)
tot = m
return one == 0 and two == 0

leetcode659. Split Array into Consecutive Subsequences的更多相关文章

  1. Split Array into Consecutive Subsequences

    659. Split Array into Consecutive Subsequences You are given an integer array sorted in ascending or ...

  2. 【LeetCode】659. Split Array into Consecutive Subsequences 解题报告(Python)

    [LeetCode]659. Split Array into Consecutive Subsequences 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...

  3. [Swift]LeetCode659. 分割数组为连续子序列 | Split Array into Consecutive Subsequences

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

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

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

  5. LeetCode Split Array into Consecutive Subsequences

    原题链接在这里:https://leetcode.com/problems/split-array-into-consecutive-subsequences/description/ 题目: You ...

  6. 659. Split Array into Consecutive Subsequences

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

  7. leetcode 659. Split Array into Consecutive Subsequences

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

  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. [LC] 659. Split Array into Consecutive Subsequences

    Given an array nums sorted in ascending order, return true if and only if you can split it into 1 or ...

随机推荐

  1. 【Linux技术】autotools制作makefile过程详解【转】

    转自:http://www.cnblogs.com/lcw/p/3159461.htmlPreface Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件 ...

  2. asp.net操作word 配置在IIS上出现的问题

    异常: 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问. (异常来自 ...

  3. TCP/IP详解(整理)

    1.概述 路由器是在网络层进行联通,而网桥是在链路层联通不同的网络. IP层用ICMP来与其他主机或路由器交换错误报文和其他的重要信息.应用程序也可以访问ICMP,两个诊断工具:Ping和Tracer ...

  4. High-Speed Tracking with Kernelized Correlation Filters(二)

          首先看看get_features函数.             首先判断是hog特征还是gray,分两种情况.             如果是hog特征,调用fhog函数,返回x,并将矩阵 ...

  5. CF529B 【Group Photo 2 (online mirror version)】

    贪心枚举最后方案中最大的h,设为maxh若某个人i的wi与hi均大于maxh,则此方案不可行若某个人恰有一个属性大于maxh,则可确定他是否换属性剩下的人按wi-hi从大到小排序后贪心选择O(nlog ...

  6. sql server 约束 查找

    --1.主键约束 SELECT tab.name AS [表名], idx.name AS [主键名称], col.name AS [主键列名] FROM sys.indexes idx JOIN s ...

  7. 搜索入门之dfs--经典的迷宫问题解析

    今天来谈一下dfs的入门,以前看到的dfs入门,那真的是入门吗,都是把dfs的实现步骤往那一贴,看完是知道dfs的步骤了,但是对于代码实现还是没有概念.今天准备写点自己的心得,真的是字面意思--入门. ...

  8. GridView监听器

    package com.example.wang.testapp2; import android.os.Bundle; import android.support.v7.app.AppCompat ...

  9. Loadrunner参数化逗号报错解决方法

    Loadrunner参数化逗号报错解决方法     介绍Loadrunner参数化时,参数中包含有逗号时出错的解决方法. 在Loadrunner进行参数化时,参数中如果含有逗号,编辑保存后会报错: 此 ...

  10. LoadRunner 参数化之 连接数据库进行参数化

    LoadRunner 参数化之 连接数据库进行参数化 Loadrunner(简称“LR”)对性能测试的脚本进行参数化时,由于数据量偏大,大家往往都会把数据录入到数据库表里,然后关联到LR,本文将详细介 ...