给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入:[10,9,2,5,3,7,101,18]
输出: 4 解释: 最长的上升子序列是[2,3,7,101],
它的长度是4
。
说明:
- 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
- 你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
典型的动态规划
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int *dp=new int[nums.size()];
int len=0;
for(int i=0;i<nums.size();i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
{
if(nums[j]<nums[i]&&dp[j]+1>dp[i])
dp[i]=dp[j]+1;
}
if(dp[i]>len)
len=dp[i];
}
delete[] dp;
return len;
}
};
复杂度:n*n
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
https://blog.csdn.net/yopilipala/article/details/60468359
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0)
return 0;
// int *dp=new int[nums.size()];
int *list=new int[nums.size()];
int len=0;
list[0]=nums[0];
for(int i=0;i<nums.size();i++)
{
if(nums[i]>list[len])
list[++len]=nums[i];
else{
int pos=lower_bound(list,list+len,nums[i])-list;
//注意lower_bound 的用法,lower_bound返回的是一个地址
list[pos]=nums[i];
}
}
delete[] list;
return len+1;
}
};