力扣659题(分割数组为连续子数组)

659、分割数组为连续子数组

具体实现:

分情况:

1、当前元素v自成一派,以自己开头构成一个长度至少为3的序列。

nums = [1,2,3,6,7,8]

遍历到6时,以自己开头形成一个符合条件的子序列[6,7,8]

2、当前元素v接到已经存在的子序列后面。

nums = [1,2,3,4,5]

遍历到4时,只能接到已经存在的子序列[1,2,3]后面。

没有办法自成开头形成新的子序列,因为少了个6

 

如何选择情况:

[1,2,3,4,5,5,6,7]

对于4,是形成一个新的子序列还是放到[1,2,3]后面?

应该优先判断自己是否能够接到其他序列后面,如果不行,再判断是否可以作为新的子序列开头

 

freq字典帮助元素判断自己是否能够作为开头

need字典帮助一个元素是否可以接到其他序列后面

 

freq记录每个元素出现的次数

freq[3]==2,3在nums中出现2次

freq[3],freq[4],freq[5]都大于0的话,说明3可以作为开头组成一个长度为3的子序列

 

need记录对接在其它序列后的元素的需求

[1,2,3,4]和[2,3,4]

need[5]的值就是2,对元素5的需求为2

 

代码:

class Solution:
    def isPossible(self, nums: List[int]) -> bool:
        need = collections.defaultdict(int)
        freq = collections.defaultdict(int)
        for k in nums:
            freq[k] += 1
        for v in nums:
            if freq[v] == 0:#已经被用到其他子序列中
                continue
            if need[v]>0:#先判断v是否能接到其他子序列后面
                freq[v] -= 1 #用掉一个v
                need[v] -= 1 #对v的需求减1
                need[v+1] +=1 #对v+1的需求加1
            elif freq[v] > 0 and freq[v+1] >0 and freq[v+2] >0:
                #v作为开头,新建一个长度为3的子序列[v,v+1,v+2]
                freq[v] -= 1
                freq[v+1] -= 1
                freq[v+2] -= 1
                need[v+3] += 1 #对v+3的需求加1
            else:
                return False
        return True

 

 https://blog.csdn.net/atoohoo/article/details/101160214?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.base&spm=1001.2101.3001.4242

 

 
posted @ 2021-08-03 09:43  最近饭吃的很多  阅读(41)  评论(0编辑  收藏  举报