zoukankan      html  css  js  c++  java
  • 力扣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

     
  • 相关阅读:
    在Django中如何使用Redis
    Redis的基本操作
    短信接口的频率限制
    版本控制器git
    windows生成公私钥以及应用
    luffy前台组件的搭建
    周末大作业
    同源策略的解决方案
    全局Response对象和全局异常捕获和日志
    爬虫之代理池搭建
  • 原文地址:https://www.cnblogs.com/zhaojiayu/p/15092907.html
Copyright © 2011-2022 走看看