300. Longest Increasing Subsequence

代码:

class Solution {
    public int lengthOfLIS(int[] nums) {
        int[]tails=new int[nums.length];
        int size=0;
        for(int n:nums){
            int pos=binarySearchLarger(tails,n,size);
            if(pos==-1){
                pos=size;
            }
            tails[pos]=n; 
            if(pos==size){
                size++;
            }
        }
        return size;
    }
    
    //find the first tail >= num
    private int binarySearchLarger(int[]arr,int target,int end){
        int left=0;
        int right=end;
        while(left<right-1){
            int mid=left+(right-left)/2;
            if(arr[mid]>=target){
                right=mid;
            }else{
                left=mid;
            }
        }
        if(arr[left]>=target){
            return left;
        }
        if(arr[right]>=target){
            return right;
        }
        return -1;
    }
}

tails[i]存储的是长度为i+1的LIS末尾元素最小值,size为当前记录到的最长的LIS长度,用于binary search时确定搜索范围,搜索结果反过来决定size要不要扩大。
输入数组元素挨个进行检验,当前元素n是否能够扩充到某个LIS后面,即替换已有的某个长度的LIS末尾元素(第一个使tails[pos]>=npos,用binary search搜索),使该长度的LIS具有更高的可扩展性;如果n比当前所有LIS末尾元素都大(即binary search没找到合法的位置,返回pos=-1时;或者初始条件size=0,更新tails[0]时),size就可以加一了。
n替换第一个tails[pos]>=n的原因:已经比n小的,不需要替换;如果tails[pos]不是第一个大于等于n的,也就是说必然存在tails[pos-1]>=n,必然存在以tails[pos]为末尾元素的IS:[a,...b,c,tails[pos]]c=tails[pos-1]>=n,则n无法替代tails[pos]与之前的元素组成IS。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值