题目如下:
解题思路:本题可以维护三个字典,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