From 50595343bd15e783948cca226609f13cad22d7ed Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Sat, 9 May 2026 22:57:59 +0900 Subject: [PATCH] Solve longest increasing subsequence --- 300_longest_increasing_subsequence/problem.md | 1 + 300_longest_increasing_subsequence/step1.md | 27 +++++++++++++++++++ 300_longest_increasing_subsequence/step2.md | 19 +++++++++++++ 300_longest_increasing_subsequence/step3.md | 21 +++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 300_longest_increasing_subsequence/problem.md create mode 100644 300_longest_increasing_subsequence/step1.md create mode 100644 300_longest_increasing_subsequence/step2.md create mode 100644 300_longest_increasing_subsequence/step3.md diff --git a/300_longest_increasing_subsequence/problem.md b/300_longest_increasing_subsequence/problem.md new file mode 100644 index 0000000..d182746 --- /dev/null +++ b/300_longest_increasing_subsequence/problem.md @@ -0,0 +1 @@ +## 問題: [300. Longest Increasing Subsequence](https://leetcode.com/problems/longest-increasing-subsequence/description/) diff --git a/300_longest_increasing_subsequence/step1.md b/300_longest_increasing_subsequence/step1.md new file mode 100644 index 0000000..1e36f15 --- /dev/null +++ b/300_longest_increasing_subsequence/step1.md @@ -0,0 +1,27 @@ +# Step 1 + +- 漸化式を作れなかった +- [NeetCode](https://www.youtube.com/watch?v=cjWnW0hdF1Y)の解法を見た + - LIS[i] を「nums[i] から始まる最長増加部分列の長さ」と定義する + - 各要素単体でも部分列なので、初期値をすべて 1 にする + - 後ろから順に各 index i を処理する + - i より右側の要素 j を見て、nums[i] < nums[j] なら連結可能 + - 連結できる場合、LIS[i] = max(LIS[i], 1 + LIS[j]) で更新する + - 最後に LIS 配列の最大値を返す + +```python +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + LIS = [1] * len(nums) + + for i in range(len(nums) - 1, -1, -1): + for j in range(len(nums) - 1, i, -1): + if nums[i] < nums[j]: + LIS[i] = max(LIS[i], 1 + LIS[j]) + + return max(LIS) +``` + +時間計算量: $O(n^2)$ + +空間計算量: $O(n)$ diff --git a/300_longest_increasing_subsequence/step2.md b/300_longest_increasing_subsequence/step2.md new file mode 100644 index 0000000..4747d2b --- /dev/null +++ b/300_longest_increasing_subsequence/step2.md @@ -0,0 +1,19 @@ +# Step 2 + +```python +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + lis_from_i = [1] * len(nums) + + for i in range(len(nums) - 1, -1, -1): + for j in range(len(nums) - 1, i, -1): + if nums[i] < nums[j]: + lis_from_i[i] = max(lis_from_i[i], 1 + lis_from_i[j]) + + return max(lis_from_i) + +``` + +時間計算量: $O(n^2)$ + +空間計算量: $O(n)$ diff --git a/300_longest_increasing_subsequence/step3.md b/300_longest_increasing_subsequence/step3.md new file mode 100644 index 0000000..e8f35aa --- /dev/null +++ b/300_longest_increasing_subsequence/step3.md @@ -0,0 +1,21 @@ +# Step 3 + +```python +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + lis_from_i = [1] * len(nums) + + for i in range(len(nums) - 1, -1, -1): + for j in range(len(nums) - 1, i, -1): + if nums[i] < nums[j]: + lis_from_i[i] = max(lis_from_i[i], 1 + lis_from_i[j]) + + return max(lis_from_i) + +``` + +1回目: 1分 17秒 + +2回目: 1分 23秒 + +3回目: 1分 14秒