最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
解法(时间复杂度为O(n^2) ):
题目中没有要求是连续的,可以有间隔,实例中[2,5,7,101]也应该是一种。所以可以定义一个dp数组,用来记录前面的最优解。最后dp中的最大值就是答案。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.empty())
return 0;
vector<int> dp(nums.size(),1);
int maxSon = dp[0]; // 整体最大值
for(int i=1;i<nums.size();i++){
int localMax = 0; // 前面局部最大的值
for(int j=0;j<i;j++){
if(nums[j] < nums[i]){
if(dp[j] > localMax)
localMax = dp[j];
}
}
dp[i] += localMax;
if(dp[i] > maxSon)
maxSon = dp[i];
}
return maxSon;
}
};