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
  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/seyjs/p/9590537.html
Copyright © 2011-2022 走看看