[leetcode-300]Longest Increasing Subsequence(java)

问题描述:这里写链接内容

分析:这道题思路还是比较简单,它要求的是满足这样条件的序列的最大长度,nums[i]

//O(n2)复杂度
public class Solution {
    public int lengthOfLIS(int[] nums) {
        int max = 0;
        if(nums.length <= 1)
            return nums.length;

        for(int i = 0;i<nums.length;i++){
            int cur = nums[i];
            int count = 0;

            int left = i-1,right = i+1;
            int leftVal = cur,rightVal = cur;
            //左移
            while(left >= 0){
                if(nums[left] < leftVal){
                    count++;
                    leftVal = nums[left];
                }
                left--;
            }
            //右移
            while(right < nums.length){
                if(nums[right] > rightVal){
                    count++;
                    rightVal = nums[right];
                }
                right++;
            }
            if(count > max)
                max = count;
        }
        return max+1;
    }
}
//O(nlogn)
public class Solution {
    public int lengthOfLIS(int[] nums) {
        if(nums.length <= 1)
            return nums.length;

        return binarySearch(nums,0,nums.length-1);
    }
    private int binarySearch(int[] nums,int left,int right){
        if(left == right)
            return 1;
        if(right - left == 1){
            if(nums[right] > nums[left])
                return 2;
            else if(nums[right] == nums[left])
                return 1;
            else
                return 0;
        }
        int mid = (left+right)/2;
        int leftlen = binarySearch(nums,left,mid);
        int rightlen = binarySearch(nums,mid,right);

        int count = 1;
        int leftVal = nums[mid],rightVal = nums[mid];
        int leftIndex = mid-1;
        int rightIndex = mid+1;

        while(leftIndex >= 0){
            if(nums[leftIndex] < leftVal){
                count++;
                leftVal = nums[leftIndex];
            }    
            leftIndex--;
        }
        while(rightIndex < nums.length){
            if(nums[rightIndex] > rightVal){
                count++;
                rightVal = nums[rightIndex];
            }
            rightIndex++;
        }

        int tmpMax = Math.max(leftlen,rightlen);
        return Math.max(tmpMax,count);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值