最长递增子序列

链接

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

class Solution {

    private int search(int[] dp, int length, int key) {
        int l = 0, r = length - 1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (dp[mid] < key) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return l;
    }

    public int lengthOfLIS(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int n = nums.length;
        int length = 1;
        int[] dp = new int[n];
        dp[0] = nums[0];

        for (int i = 1; i < n; ++i) {
            int index = search(dp, length, nums[i]);
            dp[index] = nums[i];
            if (index == length) {
                length = index + 1;
            }
        }

        return length;
    }
}
posted @ 2021-10-13 22:35  Tianyiya  阅读(44)  评论(0)    收藏  举报