LeetCode659:分割数组为连续子序列

原文来自于链接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)

猜你喜欢

转载自blog.csdn.net/weixin_45666660/article/details/110629929