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