您的位置:首页 > 产品设计 > UI/UE

Split Array into Consecutive Subsequences 解法

2017-10-26 12:12 831 查看

Split Array into Consecutive Subsequences 解法

第七周题目

难度:Media

LeetCode题号:659

题目

Description:

You are given an integer array sorted in ascending order (may contain duplicates), you need to split them into several subsequences, where each subsequences consist of at least 3 consecutive integers. Return whether you can make such a split.

Example1:

Input: [1,2,3,3,4,5]

Output: True

Explanation:

You can split them into two consecutive subsequences :

1, 2, 3

3, 4, 5

Example2:

Input: [1,2,3,3,4,4,5,5]

Output: True

Explanation:

You can split them into two consecutive subsequences :

1, 2, 3, 4, 5

3, 4, 5

Example3:

Input: [1,2,3,4,4,5]

Output: False

思考

进行两次遍历,第一次找出每个数字出现的频率,第二次切割子串。

通过unordered_map来处理,声明count用来保存数字 i 出现频率,tail用来保存以数字 i 结尾的子串的个数。

第二次循环遍历时,首先判断这个数“i”是否还已经被切割完了

若还在,向后判断他的后一个数是否是结束符,如果是,则后一个数tail值减一,当前数的tail值加一;

如果后一个数不是结束符,说明在他前面当前这个数不能并如果前面的串了,要向后发展。

判断后两个数是否存在,存在的话就抽取了后两个数(让他们的count值减一),然后让第三个数的tail值加一

如果以上情况都不存在,则说明如果构成符合题意的子串,返回false

代码

class Solution {
public:
bool isPossible(vector<int>& nums) {
unordered_map<int, int> tail, count;
for (int &i : nums) {
count[i]++;
}

for (int &i : nums) {
if (!count[i]) {
continue;
}
count[i]--;
if (tail[i-1] > 0) {
tail[i-1]--;
tail[i]++;
} else if (count[i+1] && count[i+2]) {
tail[i+2]++;
count[i+1]--;
count[i+2]--;
} else {
return false;
}
}
return true;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode