300. Longest Increasing Subsequence 最长递增序列

https://leetcode.com/problems/longest-increasing-subsequence/

在这里插入图片描述

// class Solution {
//     //动态规划。在i位置上的dp值,应该是两者额较大值:1.原dp 2.比nums[i]小的nums[j]的j位置上的dp值加一
//     public int lengthOfLIS(int[] nums) {
//         if(nums==null || nums.length==0) return 0;
//         int[] dp = new int[nums.length];
//         int res = 0;
//         for(int i=0; i<nums.length; i++){
//             for(int j=0; j<=i; j++){
//                 if(nums[j]<nums[i]){
//                     dp[i] = Math.max(dp[i], dp[j]+1);
//                 }           
//             }
//             res = Math.max(dp[i], res);
//         }
//         return res+1;
//     }
// }

class Solution {
    //nlogn的解法  https://blog.csdn.net/jmspan/article/details/51171519
    //https://www.jianshu.com/p/a3cd9df6d9d1
    public int lengthOfLIS(int[] nums) { 
        int[] increasing = new int[nums.length];
        int size = 0;  //increasing数组中放置的元素个数
        for(int i=0; i<nums.length; i++) {
            int left=0, right=size-1;
            while (left<=right) {  //二分查找increasing数组中第一个比nums[i]大的元素
                int m=(left+right)/2;
                if (nums[i] > increasing[m]) left = m + 1;
                else right = m - 1;
            }
            increasing[left] = nums[i];
            if (left==size) size ++;
        }
        return size;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值