• 力扣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

     
  • 相关阅读:
    Spring URL重写
    DOUBLE精度问题
    激光推送一
    log4j打印debug日志问题
    dpkg:处理 xxx (--configure)时出错解决办法,也可用于卸载软件出错的情况
    Ubuntu中配置tomcat
    Ubuntu16.04安装Eclipse
    删除mysql数据库后django重建数据库
    MySQL修改root密码
    django1.9和mysql
  • 原文地址:https://www.cnblogs.com/zhaojiayu/p/15092907.html
Copyright © 2020-2023  润新知