leetcode-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 more subsequences such that each subsequence consists of consecutive integers and has length at least 3.
Example 1:
1 | Input: [1,2,3,3,4,5] |
Example 2:
1 | Input: [1,2,3,3,4,4,5,5] |
Example 3:
1 | Input: [1,2,3,4,4,5] |
Constraints:
1 <= nums.length <= 10000
分析
思路1:对于输入数组中给定的每一个数字 num 而言,其最好的情况是加入到一个以 num-1 结尾的长度大于等于3的连续子序列中,否则要自己建立一个以num为起始数组的长度大于等于 3 连续子序列。若都不行则返回false,若处理完输入数组中所有的数字依然没有发生冲突则返回true。实现过程中需要使用两个hash表来进行预处理。时间复杂度O(n) 空间复杂度 O(n)。
思路2:对于输入数组中给定的每一个数字 num 而言,我们希望可以知道以 num-1 为结尾的连续子串的情况。prev 表示 num之前的一个数组,p1表示以prev结尾的长度为1的子序列的数量,p2表示以prev结尾的长度为2的子序列的数量,p3表示以prev结尾的长度大于等于3的子序列的数量。在处理当前数字 num 时,我们还需要记录num的数量count。如果 prev != num - 1,那么说明 num 单独成为一个子序列的起始,以prev结尾的子序列不应该存在长度等于1或者长度等于2的情况。如果 prev == num-1,那么num的数量应该至少大于等于 p1+p2,否则下一个处理的数字将会大于 prev+1,以prev结尾且子序列长度小于3的子序列将会永远存在。另外在 count >= p1 + p2 的情况下,num应该优先补充以prev结尾且长度为1的子序列(若存在),然后补充以prev结尾长度为2的子序列(若存在),其次补充以prev结尾长度大于等于3的子序列。处理完之后更新 prev 为num,同时更新p1,p2,p3 为相应的值。时间复杂度O(n),空间复杂度O(1)。
代码1
1 | class Solution { |
代码2
1 | class Solution { |
Author: Hatton.Liu
Link: http://hattonl.github.io/2020/03/06/leetcode-659/
License: 知识共享署名-非商业性使用 4.0 国际许可协议