Given an integer array nums, return the length of the longest strictly increasing subsequence.

A subsequence is a sequence that can be derived from an array by deleting some or no elements without changing the order of the remaining elements. For example, [3,6,2,7] is a subsequence of the array [0,3,1,6,2,2,7].


Test Cases

Example 1:

Input: nums = [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.

Example 2:

Input: nums = [0,1,0,3,2,3]
Output: 4

Example 3:

Input: nums = [7,7,7,7,7,7,7]
Output: 1

Solution

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        int[] lis = new int[n];
        int size = 0;
        for(int i=0; i<n; i++) {
            int start = 0, end = size;
            while(start != end) {
                int mid = start + (end-start)/2;
                if (lis[mid] < nums[i]) {
                    start = mid+1;
                } else {
                    end = mid;
                }
            }
            lis[start] = nums[i];
            if (start == size) ++size;
        }
        return size;
    }
}
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        size, lis = 0, [0]*len(nums)
        for num in nums:
            start, end = 0, size
            while start != end:
                mid = start + (end-start)//2
                if lis[mid] < num:
                    start = mid+1
                else:
                    end = mid
            lis[start] = num
            if start == size:
                size += 1
        return size
Time Complexity: O(nlogn)
Space Complexity: O(n)