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
  • 相关阅读:
    计算机网络通信
    javap查看class文件
    JDK动态代理与CGLib动态代理
    error the @annotation pointcut expression is only supported at Java 5 compliance
    redis清空缓存
    利用HttpURLConnection发送请求
    linux下用命令导出mysql表数据
    adb push和pull使用
    mysqld.exe占比cpu 100% 解决方案
    养成好习惯
  • 原文地址:https://www.cnblogs.com/seyjs/p/9590537.html
Copyright © 2011-2022 走看看