1. 程式人生 > >leetcode 354. 俄羅斯套娃信封問題

leetcode 354. 俄羅斯套娃信封問題

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 (w, h) 出現。當另一個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另一個信封裡,如同俄羅斯套娃一樣。

請計算最多能有多少個信封能組成一組“俄羅斯套娃”信封(即可以把一個信封放到另一個信封裡面)。

示例:

輸入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
輸出: 3 
解釋: 最多信封的個數為 3, 組合為: [2,3] => [5,4] => [6,7]。
  • o(n^2) solution
class Solution(object):
    def maxEnvelopes
(self, envelopes):
""" :type envelopes: List[List[int]] :rtype: int """ if not envelopes:return 0 nums = sorted(envelopes,key=lambda x: x) dp = [1]*len(nums) for i in range(1,len(nums)): for j in range(i-1,-1,-1): if
nums[i][0] > nums[j][0] and nums[i][1] > nums[j][1]: dp[i] = max(dp[i],dp[j]+1) return max(dp)
  • o(n*logn) solution
import bisect
class Solution(object):
    def maxEnvelopes(self, envelopes):
        """
        :type envelopes: List[List[int]]
        :rtype: int
        """
if not envelopes:return 0 envs = sorted(envelopes,key=lambda (x,y): (x,-y)) tails=[] for (w,h) in envs: idx=bisect.bisect_left(tails, h) if idx==len(tails): tails.append(h) elif idx==0 or tails[idx-1]<h: tails[idx]=h return len(tails)

解釋:通過對w升序排列,對h降序排列,然後h的最長遞增子序列長度就是題目要求的長度;求最長遞增子序列通過二分法優化成o(n*logn)