最长上升子序列 dp + 二分法
#include<bits/stdc++.h>
using namespace std;
//动态规划 O(n^2)
int lengthOfLIS(vector<int>& nums) {
int result = 0;
int n = nums.size();
vector<int> dp(n,1);
if(n == 1){
return n;
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(nums[j] < nums[i]){
dp[i] = (dp[j] + 1) > dp[i] ? (dp[j] + 1) : dp[i];
}
}
result = result < dp[i] ? dp[i] : result;
}
return result;
}
//二分查找,查找第一个小于key的数,O(nlogn)
int lengthOfLIS1(vector<int>& nums) {
int n = nums.size();
if(n==1){
return n;
}
vector<int> arr;
arr.push_back(nums[0]);
for(int i=1;i<n;i++){
if(nums[i]>arr[arr.size()-1]){
arr.push_back(nums[i]);
}else{
int l = -1,r = arr.size();
while(l+1 != r){
int m = (l+r)/2;
if(arr[m] < nums[i]){
l = m;
}else{
r = m;
}
}
arr[l+1] = nums[i];
}
}
return arr.size();
}
int main(){
vector<int> v = {10,9,2,5,3,7,101,18};
int result = lengthOfLIS1(v);
cout << result << endl;
return 0;
}