给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
O(n)的解法:
我们设立一个数组 dp ,使用 dp[i] 记录 以 nums[i] 结尾的LIS 的长度,那么 dp[i] 就等于 num[i] 跟 dp[0…i - 1] 所组成的 LIS 的最大值,容易得到状态转移方程为 dp[i] = max(dp[i],dp[j] + 1),j >= 0 && j < i && nums[i] > nums[j]。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
if(!len)
return 0;
auto dp = vector<int> (len,1);
for(int i = 1;i < len;i ++){
for(int j = 0;j < i;j ++){
if(nums[i] > nums[j]){
dp[i] = max(dp[i],dp[j] + 1);
}
}
}
return *(max_element(dp.begin(),dp.end()));
}
};