题目:300. 最长递增子序列
思路:贪心+二分查找,维护一个单调递增的数组,时间复杂度0(nlogn)。
v[i] 表示长为 i+1 的上升子序列的末尾元素的最小值。
C++版本:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> v;
//哨兵
v.push_back(-100000);
for(auto x:nums){
int l=0,r=v.size();
while(l<r){
int mid=(l+r)/2;
if(v[mid]<x) l=mid+1;
else r=mid;
}
if(l>=v.size()) v.push_back(x);
else v[l]=x;
}
return v.size()-1;
}
};
JAVA版本:
class Solution {
public int lengthOfLIS(int[] nums) {
int n=nums.length;
int[] v=new int[n+1];
v[0]=-100000;
int top=1;
for(var x:nums){
int l=0,r=top;
while(l<r){
int mid=(l+r)/2;
if(v[mid]<x) l=mid+1;
else r=mid;
}
if(l>=top) top++;
v[l]=x;
}
return top-1;
}
}
Go版本:
func lengthOfLIS(nums []int) int {
n:=len(nums)
v:=make([]int,n+1)
v[0]=-100000
top:=1
for _,x:=range nums {
l,r:=0,top
for l<r {
mid:=(l+r)/2;
if v[mid]<x {
l=mid+1
}else{
r=mid
}
}
if l>=top {
top++
}
v[l]=x
}
return top-1;
}