题目 最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 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 动态规划
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size() , 1);
int Max = 1;
for(int i=1 ; i<dp.size() ; i++)
{
for(int j=0 ; j<i ; j++)
{
if(nums[j] < nums[i])
dp[i] = max(dp[j]+1 , dp[i]);
}
Max = max(Max , dp[i]);
}
return Max;
}
};
解2 动态规划+非二分/二分
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() == 0) return 0;
int i,j;
vector<int> dp(nums.size(),-1);
int len = 1;
dp[1] = nums[0];
for(i=1 ; i<nums.size() ; i++)
{
for(j=len ; nums[i] <= dp[j] && j>0 ; j--);
dp[j+1] = nums[i];
len = max(len,j+1);
// cout<<"len:"<<len<<endl;
}
return len;
}
};
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() == 0) return 0;
int i,j , mid , high , low;
vector<int> dp(nums.size()+1,INT_MAX);
int len = 1;
dp[1] = nums[0];
for(i=1 ; i<nums.size() ; i++)
{
if(nums[i] > dp[len]) dp[++len] = nums[i];
else
{
low =1;
high = len;
while(low <= high)
{
mid = (low+high)/2;
if(dp[mid] < nums[i] && dp[mid+1] >= nums[i])
{
dp[mid+1] = nums[i];
break;
}
else if(dp[mid] >= nums[i])
{
high = mid-1;
if(high == 0) dp[1] = nums[i];
}
else
low = mid+1;
}
}
}
return len;
}
};