leetcode链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/submissions/
题目描述:给定一个长度为N的序列nums[9] = {5, 6, 7, 1, 2, 8}
解法一:动态规划(O(n^2))
f[i]表示以第i个数字结尾的最长上升序列的长度。
如果nums[i]比前面某个值大,那么就比较一下f[i]和f[j]+1,取最大即可。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
vector<int> f(n);
f[0] = 1;
int res = f[0];
for(int i = 1; i < n; i ++){
f[i] = 1;
for(int j = 0; j < i; j++)
if(nums[i] > nums[j])
f[i] = max(f[i], f[j] + 1);
res = max(res, f[i]);
}
return res;
}
};
解法二:利用二分优化成O(n*logn)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
vector<int> B(n+1);
B[0] = nums[0];
int len = 1, pos = 0;
for(int i = 1; i < n; i++){
if(nums[i] > B[len-1]){
B[len] = nums[i];
len++;
}
else{
pos = BiSearch(B, len, nums[i]);
B[pos] = nums[i];
}
}
return len;
}
int BiSearch(vector<int>& B, int len, int w){
int left = 0, right = len-1;
int mid;
while(left <= right){
mid = left + (right - left) / 2;
if(B[mid] > w)
right = mid - 1;
else if(B[mid] < w)
left = mid + 1;
else
return mid;
}
return left;
}
};