DP

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        # dp[i]: longest subsequence length ending with nums[i]
        # time O(N^2) space O(N)
        # base case 
        dp = [1] * len(nums)
        for i in range(len(nums)):
            for j in range(i):
                if nums[j] < nums[i]:
                    dp[i] = max(dp[i],dp[j] + 1)
        # get biggest val in dp[]
        res = 0
        for i in range(len(dp)):
            res = max(res,dp[i])
        return res # return max(dp) 

DP + Binary Search