1. 程式人生 > >【leetcode】354. Russian Doll Envelopes

【leetcode】354. Russian Doll Envelopes

eight 輸入 turn 保存 所在 object max col 最小

題目如下:

技術分享圖片

解題思路:本題有兩個維度(寬和高),必須兩個維度同時滿足條件才行。我們可以把輸入數組按其中一個維度排序,例如按寬從小到大排序,如果寬相等,再比較高。這樣的話,對於數組中任意一個元素(信封),能夠放入該信封的其他信封一定在該信封所在位置的左邊。接下來從頭開始遍歷數組,因為寬度是遞增的,因此我們只需要考慮信封的高度,同時我們可以用字典dic[i] = minHeight保存可以放入i個信封的最小高度。對於任意一個信封,只要按key從大到小的順序比較dic,找到key最大並且其信封高度大於dic[i]即表示這個信封能放入(i)個信封,並且同時更新dic[i+1] = min(dic[i+1],當前信封高度)。這裏有一個要註意的是,信封寬度存在相等的情況,而寬度相同的信封是無法互相放入的。因此在更新dic[i+1] = min(dic[i+1],當前信封高度)的時候,需要要先一個holdlist保存要更新的所有數組,只有在當前信封的寬度和下一個信封寬度不相同的時候,才做批量更新。

代碼如下:

class Solution(object):
    def maxEnvelopes(self, envelopes):
        """
        :type envelopes: List[List[int]]
        :rtype: int
        """
        if len(envelopes) == 0:
            return 0
        def cmpf_w(v1, v2):
            if v1[0] != v2[0]:
                return v1[0] - v2[0]
            
return v1[1] - v2[1] envelopes.sort(cmp=cmpf_w) res = 1 holdlist = [] dic = {} for i in range(len(envelopes)): flag = False for j in range(res,-1,-1): if j not in dic: continue elif
dic[j]>= envelopes[i][1]: continue else: flag = True res = max(res,j+1) holdlist.append([j+1,envelopes[i][1]]) break if flag == False: holdlist.append([1,envelopes[i][1]]) if i == len(envelopes) - 1 or envelopes[i][0] < envelopes[i+1][0]: for k in holdlist: if k[0] not in dic: dic[k[0]] = k[1] else: dic[k[0]] = min(dic[k[0]],k[1]) holdlist = [] #print dic return res

【leetcode】354. Russian Doll Envelopes