leetcode 354. 俄羅斯套娃信封問題
阿新 • • 發佈:2019-01-01
給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 (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)