leetcode659. Split Array into Consecutive Subsequences
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的更多相关文章
- Split Array into Consecutive Subsequences
659. Split Array into Consecutive Subsequences You are given an integer array sorted in ascending or ...
- 【LeetCode】659. Split Array into Consecutive Subsequences 解题报告(Python)
[LeetCode]659. Split Array into Consecutive Subsequences 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...
- [Swift]LeetCode659. 分割数组为连续子序列 | Split Array into Consecutive Subsequences
You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...
- [LeetCode] Split Array into Consecutive Subsequences 将数组分割成连续子序列
You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...
- LeetCode Split Array into Consecutive Subsequences
原题链接在这里:https://leetcode.com/problems/split-array-into-consecutive-subsequences/description/ 题目: You ...
- 659. Split Array into Consecutive Subsequences
You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...
- leetcode 659. Split Array into Consecutive Subsequences
You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...
- [LeetCode] 659. Split Array into Consecutive Subsequences 将数组分割成连续子序列
You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...
- [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 ...
随机推荐
- linux下pip安装无法连接官网
为了安装pwntools等工具,要先安装pip,系统安装好了,却遇到了无法连接到pip官网的报错,找了半天方法最终解决 wget https://bootstrap.pypa.io/get-pip.p ...
- 十九、springboot使用@ControllerAdvice(二)之深入理解
前言: 接口类项目开发时,为了便于后期查找问题,一般会拦截器或过滤器中记录每个接口请求的参数与响应值记录, 请求参数很容易从request中获取,但controller的返回值无法从response中 ...
- rsync + inotify 实时同步
1. 前言 2 台 nginx 需要做集群, 静态文件和php文件都在nginx服务器本地. 有三种方案: (1)NFS (2)Rsync + inotify (3)共享存储服务器 第一种:当 nfs ...
- 排序与相关性(Sorting and Relevance)
本文翻译自Elasticsearch官方指南的Sorting and Relevance一章的第一节. 原文地址:http://www.elastic.co/guide/en/elasticsearc ...
- 深度解析eclipse控制台
第一个按钮:scroll lock 控制台在打印sql语句的时候会一直滚动,用这个按钮可以固定住控制台不乱跑; 第二个按钮:show console when standard out changes ...
- 洛谷P2016战略游戏
传送门啦 战略游戏这个题和保安站岗很像,这个题更简单,这个题求的是士兵人数,而保安站岗需要求最优价值. 定义状态$ f[u][0/1] $ 表示 $ u $ 这个节点不放/放士兵 根据题意,如果当前节 ...
- vim 中替换命令
vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询. :s/vivian/s ...
- GreenPlum学习笔记:基础知识
一.介绍 GreenPlum分布式数据仓库,大规模并行计算技术. 无共享/MPP核心架构 Greenplum数据库软件将数据平均分布到系统的所有节点服务器上,所以节点存储每张表或表分区的部分行,所有数 ...
- python中mock的使用
什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x 中 mock ...
- day2编写购物商城
作业:购物商城 商品展示,价格 买,加入购物车 付款,钱不够 流程图如下: 代码共有4个文件,如下: 用户文件: alex geng zhang lou zeng 商品文件: 小米3 比亚迪宋 格力变 ...