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
  • 相关阅读:
    mysql BETWEEN操作符 语法
    mysql IN操作符 语法
    mysql LIKE通配符 语法
    mysql TOP语句 语法
    mysql DELETE语句 语法
    mysql Update语句 语法
    mysql INSERT语句 语法
    mysql ORDER BY语句 语法
    mysql OR运算符 语法
    mysql AND运算符 语法
  • 原文地址:https://www.cnblogs.com/seyjs/p/9590537.html
Copyright © 2011-2022 走看看