原文来自于链接https://nickhuang1996.blog.csdn.net/article/details/110628258
目录
一、题目
给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。
如果可以完成上述分割,则返回 true ;否则,返回 false 。
示例 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, 10000]
二、解题思路
每次都记录以哪个数字结尾:
1.当前数字如果在count1里找到之前的数字结尾的计数不为0,则count2里添加当前数字结尾的计数,count1里之前的数字结尾计数减1;
2.同理,当前数字如果在count2里找到之前的数字结尾的计数不为0,则count3up里添加当前数字结尾的计数,count2里之前的数字结尾计数减1;
3.三个数满足要求了,只需要当前数字如果在count3up里找到之前的数字结尾的计数不为0,则count3up里添加当前数字结尾的计数,count3up里之前的数字结尾计数减1;
4.最后只要判断count1和count2里的数字结尾计数是否都为0即可;
三、代码
from collections import defaultdict
class Solution:
def isPossible(self, nums: list) -> bool:
"""
:param nums:
:return:
每次都记录以哪个数字结尾:
当前数字如果在count1里找到之前的数字结尾的计数不为0,则count2里添加当前数字结尾的计数,count1里之前的数字结尾计数减1;
同理,当前数字如果在count2里找到之前的数字结尾的计数不为0,则count3up里添加当前数字结尾的计数,count2里之前的数字结尾计数减1;
三个数满足要求了,只需要当前数字如果在count3up里找到之前的数字结尾的计数不为0,则count3up里添加当前数字结尾的计数,count3up里之前的数字结尾计数减1;
"""
count1 = defaultdict(int) # 一个数
count2 = defaultdict(int) # 两个数
count3up = defaultdict(int) # 三个数或以上
for i in nums:
if count1[i - 1]:
count1[i - 1] -= 1
count2[i] += 1
elif count2[i - 1]:
count2[i - 1] -= 1
count3up[i] += 1
elif count3up[i - 1]:
count3up[i - 1] -= 1
count3up[i] += 1
else:
count1[i] += 1
return sum(count1.values()) == 0 and sum(count2.values()) == 0
if __name__ == '__main__':
nums = [1, 2, 3, 3, 4, 4, 5, 5]
s = Solution()
ans = s.isPossible(nums)
print(ans)