zoukankan      html  css  js  c++  java
  • 【leetcode】659. Split Array into Consecutive Subsequences

    题目如下:

    解题思路:本题可以维护三个字典,dic_1保存没有组成序列的单元素,dic_2保存组成了包含两个元素的序列中的较大的元素,dic_3保存组成了包括三个或者三个以上元素的序列中的最大值。因为合法的序列至少要三个元素,解题的关键是要使得dic_2和dic_1的元素尽快满足条件。对于任意一个还没有加入字典的元素,加入字典的优先级从高到低排序分别是dic_2 > dic_1 > dic_3,即优先匹配dic_2,接下来匹配dic_1,再就是dic_3,如果三个都不满足,说明在目前条件下市落单的元素,加入dic_1。这里需要主要的是如果匹配上了dic_2,那么会把这个序列从dic_2中移除,加入dic_3;同理匹配dic_1的话则将dic_1移除加入dic_2。

    代码如下:

    class Solution(object):
        def isPossible(self, nums):
            dic_1 = {}
            dic_2 = {}
            dic_3 = {}
            for i in nums:
                if i-1 in dic_2:
                    dic_2[i-1] -= 1
                    if dic_2[i-1] == 0:
                        del dic_2[i-1]
                    if i in dic_3:
                        dic_3[i] += 1
                    else:
                        dic_3[i] = 1
                elif i-1 in dic_1:
                    dic_1[i - 1] -= 1
                    if dic_1[i - 1] == 0:
                        del dic_1[i - 1]
                    if i in dic_2:
                        dic_2[i] += 1
                    else:
                        dic_2[i] = 1
                elif i-1 in dic_3:
                    dic_3[i - 1] -= 1
                    if dic_3[i - 1] == 0:
                        del dic_3[i - 1]
                    if i in dic_3:
                        dic_3[i] += 1
                    else:
                        dic_3[i] = 1
                else:
                    if i in dic_1:
                        dic_1[i] += 1
                    else:
                        dic_1[i] = 1
            #print dic_1,dic_2,dic_3
            for k,v in dic_1.iteritems():
                if k-1 not in dic_3 or dic_3[k-1] < v:
                    return False
                dic_3[k-1] -= v
    
                dic_1[k] = 0
    
                if k in dic_3:
                    dic_3[k] += v
                else:
                    dic_3[k] = 1
    
    
            for k,v in dic_2.iteritems():
                if k-2 not in dic_3 or dic_3[k-2] < v:
                    return False
                dic_3[k-2] -= v
    
                dic_2[k] = 0
    
                if k in dic_3:
                    dic_3[k] += v
                else:
                    dic_3[k] = 1
    
            return True
  • 相关阅读:
    后缀自动机学习笔记
    [bzoj4516][Sdoi2016]生成魔咒——后缀自动机
    [bzoj1692][Usaco2007 Dec]队列变换——贪心+后缀数组
    BZOJ4811 [Ynoi2017]由乃的OJ
    codeforces796E Exam Cheating
    BZOJ1004 [HNOI2008]Cards
    BZOJ1798 [Ahoi2009]Seq 维护序列seq
    BZOJ4785 [Zjoi2017]树状数组
    UOJ207 共价大爷游长沙
    POJ3768 Katu Puzzle
  • 原文地址:https://www.cnblogs.com/seyjs/p/9590537.html
Copyright © 2011-2022 走看看