本文最后更新于:2022年4月9日 中午
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h)
出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
说明:
不允许旋转信封。
示例:
| 输入: envelopes = 输出: 3 解释: 最多信封的个数为 3, 组合为: => => 。
|
Solution
- 动态规划
- 将信封按照宽
w
从小到大排序后,便只需考虑信封的宽不同并且后面信封的高h
大于前面信封即可
| class Solution: def maxEnvelopes(self, envelopes: List[List[int]]) -> int: envelopes.sort(key=lambda x: (x[0], -x[1])) height = [] n=len(envelopes) dp=[1]*n res=0 for i in range(n): for j in range(i): if envelopes[i][1]>envelopes[j][1]: dp[i]=max(dp[i],dp[j]+1) res=max(res,dp[i]) return res
|
@yim-6
- 二分法
- 例如数组为[2,5,3,4]
当遍历到2时,数组arr为空,加入首元素变为[2]
当遍历到5时,arr中存储的数为[2,5]
当遍历到3时,target=3,在arr中二分查找可插入的位置index,此位置上的数arr[index]>=taget,将index位置上的数替换为target,arr=[2,3],而后面的数num可能出现target<=num<=arr[index],使得子序列更长
当遍历到4时,arr变为[2,3,4]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution: def maxEnvelopes(self, envelopes: List[List[int]]) -> int: envelopes.sort(key=lambda x: (x[0], -x[1])) n=len(envelopes) arr=[envelopes[0][1]] def bin_search(target): l,r=0,len(arr)-1 while l<=r: mid=l+(r-l)//2 if arr[mid]==target: return mid elif arr[mid]>target: r=mid-1 else: l=mid+1 return l for i in range(n): w,h=envelopes[i] index=bin_search(h) if index==len(arr): arr.append(h) else: arr[index]=h return len(arr)
|