---
# System prepended metadata

title: Leetcode 300. Longest Increasing Subsequence
tags: [Leetcode, Greedy, Binary Search]

---

# Leetcode 300. Longest Increasing Subsequenece

## 題解

### 題解

```python!
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        # Time complexity: O(n^2)
        # Space complexity: O(n)
        n = len(nums)
        dp = [1 for i in range(n)]
        for i in range(n):
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i],dp[j] + 1)
        return max(dp)
```

### 貪心 + 二分搜索

```python=
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        # Time complexity: O(nlogn)
        # Space complexity: O(n)
        lts = []

        for n in nums:
            if not lts or n > lts[-1]: # 如果lts沒有元素或者 n 大於遞增序列的最後一位
                lts.append(n)
            else:
                # 搜索要替換的位置
                left, right = 0, len(lts) - 1
                loc = right
                while left <= right:
                    mid = left + (right - left) // 2
                    if lts[mid] >= n:
                        loc = mid
                        right = mid - 1
                    else:
                        left = mid + 1
                lts[loc] = n
        return len(lts)

```