- 最长递增子序列
// 方法一:动态规划O(N^2)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int num_len = nums.size();
int dp[num_len];
dp[0] = 1;
int result = 1;
for(int i=1;i<num_len;++i){
dp[i] = 1;
for(int j=i-1;j>=0;--j)
if(nums[i] > nums[j])
dp[i] = max(dp[j]+1, dp[i]);
result = max(result, dp[i]);
}
return result;
}
};
//方法二:贪心 + 二分 O(NlogN)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int num_len = nums.size();
int dp[num_len];
int res = 0;
dp[res] = nums[0];
res ++;
for(int i=1;i<num_len;++i){
if(dp[res-1] < nums[i]){
dp[res++] = nums[i];
} else {
int left = 0, right = res, flag = false;
while(left < right){
int mid = left + ((right - left) >> 1);
if(dp[mid] == nums[i]){
flag = true;
break;
}
if(dp[mid] < nums[i]) left = mid + 1;
else right = mid;
}
if(!flag)
dp[left] = nums[i];
// for(int j=0;j<res;++j){
// cout <<dp[j] << " ";
// }
// cout << endl;
}
}
return res;
}
};