动态规划方法
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
vector<int> dp(n, 1);
for (int i = 0; i < n; ++i){
for(int j = 0; j < i; ++j){
if(nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
return *max_element(dp.begin(), dp.end());
}
};
贪心 + 二分法
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
vector<int> dp;
dp.push_back(nums[0]);
for (int i = 1; i < n; ++i) {
if (dp.back() < nums[i]) {
dp.push_back(nums[i]);
}
else {
int left = 0, right = dp.size() - 1;
while(left < right) {
int mid = (right + left) >> 1;
if (dp[mid] >= nums[i]) {
right = mid;
}
else {
left = mid + 1;
}
}
dp[right] = nums[i];
}
}
return dp.size();
}
};