其他分享
首页 > 其他分享> > 最长上升子序列

最长上升子序列

作者:互联网

题目链接

最长上升子序列

题目描述

注意

解答思路

代码

// 动态规划 + 二分查找
class Solution {
    public int lengthOfLIS(int[] nums) {
        // tails数组用来存储长度为i + 1的子序列尾部元素的最小值
        // 该数组一定是递增的
        int[] tails = new int[nums.length];
        tails[0] = nums[0];
        
        int res = 1;

        for(int num : nums) {
            // 左边界
            int i = 0;
            // 由边界为此时tails数组的填充长度,也是此时的最长子序列
            int j = res;

            // 如果此时tails数组中所有的值都小于当前的数值,则更新最长子序列
            if(tails[res - 1] < num) {
                tails[res] = num;
                res++;
                continue;
            }

            // 其余情况二分查找第一个比当前数值大的tails值
            while(i < j) {              
                int m = (i + j) / 2;
                if(tails[m] < num) {
                    // 向右查找
                    i = m + 1;
                }
                else {
                    // 向左查找
                    j = m;
                }
            }
            // 更新第一个比当前数字大的tails值为当前的数值
            tails[i] = num;
        }
        return res;
    }
}

关键点

标签:int,元素,尾部,tails,数组,序列,上升,最长
来源: https://blog.csdn.net/weixin_51628158/article/details/120255831