1. 最长上升子序列
Leetcode 300: 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。
1 | 输入: [10,9,2,5,3,7,101,18] |
1.1 动态规划解法
- dp[i] : 以i为结尾的最长上升子序列
1 | class Solution: |
1.2 二分查找
基于贪心的思想,并结合二分查找解题。
新建数组 res,用于保存最长上升子序列。对原序列进行遍历,将每位元素二分插入 cell 中。
- 如果 res 中元素都比它小,将它插到最后
- 否则,用它覆盖掉比它大的元素中最小元素
总之,思想就是让 res 中存储比较小的元素。这样,res 未必是真实的最长上升子序列,但长度是对的。
1 | class Solution: |
2. 俄罗斯套娃娃信封问题
Leetcode 354 俄罗斯套娃娃信封问题
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
说明:
不允许旋转信封。
示例:
1 | 输入: envelopes = [[5,4],[6,4],[6,7],[2,3]] |
思路:
- 按照宽度升序、高度降序给信封排序
- 此时宽度已经是升序状态,可以将问题理解为乱序的高度的最长上升子序列问题。
1 | class Solution: |
3 俄罗斯套娃娃信封问题发散
假如存在两封信封的宽度相同,且同样宽度也可以塞进去(即大信封的宽度和高度都不小于小信封的高度和宽度),怎么处理?
思路:
- 按照宽度升序、高度升序给信封排序
- 此时宽度已经是升序状态,可以将问题理解为乱序的高度的最长上升子序列问题。
- 注意,这个题意下不需要给高度做降序操作