给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
1.动态规划,时间复杂度O(n^2).
思路 : 状态: dp[i]代表当前到i为止,以i结尾的最长子序列的长度。用一个整数表示。
递推方程: dp[i] = for(i...j)if(nums[j]>nums[i])max(nums[i],nums[j]+1)。
边界:初始化,即给每个dp[i]赋值为1.即每个都有可能是以当前子串为最终序列。(很重要)
附上代码:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0)
return 0;
vector<int> s(nums.size(),1);
for(int i = 1;i<nums.size();i++){
for(int j = 0;j<i;j++){
if(nums[i]>nums[j])
{
s[i] = max(s[i],s[j]+1);
}
}
}
int res = 1;
for(int i = 0;i<nums.size();i++){
res = max(s[i],res);
}
return res;
}
};
2.进阶,O(nlogn).