300. Longest Increasing Subsequence(最长递增子序列)
题目大意
Given an integer array nums
, return the length of the longest strictly increasing subsequence.
中文释义
给定一个整数数组 nums
,返回最长严格递增子序列的长度。
示例
- 示例 1:
- 输入:
nums = [10,9,2,5,3,7,101,18]
- 输出:
4
- 解释:最长递增子序列是 [2,3,7,101],因此长度为 4。
- 输入:
- 示例 2:
- 输入:
nums = [0,1,0,3,2,3]
- 输出:
4
- 输入:
- 示例 3:
- 输入:
nums = [7,7,7,7,7,7,7]
- 输出:
1
- 输入:
限制条件
1 <= nums.length <= 2500
-10^4 <= nums[i] <= 10^4
进阶
你能否想出一个运行时间复杂度为 O(n log(n)) 的算法?
解题思路
使用动态规划和二分搜索的方法解决问题。创建一个数组 tails
来保存当前找到的最长递增子序列。
步骤说明
- 遍历数组
nums
中的每个元素。 - 对于每个元素,使用二分搜索在
tails
中找到它应该插入的位置。 - 如果元素大于
tails
中的所有元素,则将它添加到tails
的末尾。 - 如果找到一个位置,则用当前元素替换在该位置的元素。
- 最终,
tails
的大小即为最长递增子序列的长度。
代码
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> tails;
for (int i = 0; i < nums.size(); i++) {
auto it = lower_bound(tails.begin(), tails.end(), nums[i]);
if (it == tails.end()) tails.push_back(nums[i]);
else *it = nums[i];
}
return tails.size();
}
};