From da86b7bbd6e56418e92821552703f034c9ea77a7 Mon Sep 17 00:00:00 2001 From: ryosuketc <43229670+ryosuketc@users.noreply.github.com> Date: Wed, 19 Nov 2025 05:26:00 +0900 Subject: [PATCH 1/2] 53. Maximum Subarray https://leetcode.com/problems/maximum-subarray/ --- 53_maximum_subarray/memo.md | 31 +++++++++++++++++++++++ 53_maximum_subarray/step1.cpp | 46 +++++++++++++++++++++++++++++++++++ 53_maximum_subarray/step2.cpp | 35 ++++++++++++++++++++++++++ 53_maximum_subarray/step3.cpp | 0 4 files changed, 112 insertions(+) create mode 100644 53_maximum_subarray/memo.md create mode 100644 53_maximum_subarray/step1.cpp create mode 100644 53_maximum_subarray/step2.cpp create mode 100644 53_maximum_subarray/step3.cpp diff --git a/53_maximum_subarray/memo.md b/53_maximum_subarray/memo.md new file mode 100644 index 0000000..1f828e3 --- /dev/null +++ b/53_maximum_subarray/memo.md @@ -0,0 +1,31 @@ +# 53. Maximum Subarray + +https://leetcode.com/problems/maximum-subarray/ + +## Comments + +### step1 + +* 解いたことあるような気はしつつ、解法暗記しているわけではないので exmple 見ながら考えてみた。 +* 愚直に実装するなら O(n^2) (区間を決めて、その区間ごとに sum を再計算すると O(n^3) だが、running sum を持っておけば O(n^2) になる、あるいは累積和の配列を作ってもよい) +* とはいえ subarray == 連続する要素の array で、sliding window の問題として解けそう +* 例を使っていくつかシミュレーションしてみる。要は window をいつリセットするかで、それまでの累積和が、その単一の要素より小さければよいだろうというあたりをつけた +* 脳内デバッガをちゃんと回すべきだったが、`step1.SolutionWA` のように書いて WA + * `max_subarray_sum = 0` ではなく `nums[i]`。`[-1]` みたいな配列で 0 を返してしまう + * `if subarray_sum < 0` の条件が必要。`[1, 2]` で `2` (3 ではなく) になってしまう +* `SolutionAC` で 9:00 くらいで AC + +### step2 + +* https://github.com/ryosuketc/leetcode_arai60/pull/45/files + * ああ、DP の問題でもあったのか。Kadane's Algorithm とか。今回はちょっと深煎りしないけど。 + * `Solution1`: max 使えばもっとシンプルに書ける (if 分岐を消せる) +* https://github.com/konnysh/arai60/pull/4#discussion_r1835271603 + * `INT_MIN` とかそういえばあったが、`std::numeric_limits::min()` がモダン。最近使ってないので、C++ 番 `math.inf` どう書くのか忘れていた + * https://cpprefjp.github.io/reference/climits/int_min.html + * https://cpprefjp.github.io/reference/limits/numeric_limits.html + * `Solution2`: 一応これが一番シンプルかな + +### step3 + +* skip diff --git a/53_maximum_subarray/step1.cpp b/53_maximum_subarray/step1.cpp new file mode 100644 index 0000000..ab9a141 --- /dev/null +++ b/53_maximum_subarray/step1.cpp @@ -0,0 +1,46 @@ +class Solution { +public: + int maxSubArray(vector& nums) { + if (nums.empty()) { + return 0; // error + } + int max_subarray_sum = 0; + int subarray_sum = nums[0]; + for (int i = 1; i < nums.size(); ++i) { + int num = nums[i]; + if (subarray_sum < num) { + subarray_sum = num; // Reset the window + max_subarray_sum = std::max(max_subarray_sum, subarray_sum); + continue; + } + subarray_sum += num; + max_subarray_sum = std::max(max_subarray_sum, subarray_sum); + } + return max_subarray_sum; + + } +}; + + +class SolutionAC { +public: + int maxSubArray(vector& nums) { + if (nums.empty()) { + return 0; // error + } + int max_subarray_sum = nums[0]; + int subarray_sum = nums[0]; + for (int i = 1; i < nums.size(); ++i) { + int num = nums[i]; + if (subarray_sum < 0 && subarray_sum < num) { + subarray_sum = num; // Reset the window + max_subarray_sum = std::max(max_subarray_sum, subarray_sum); + continue; + } + subarray_sum += num; + max_subarray_sum = std::max(max_subarray_sum, subarray_sum); + } + return max_subarray_sum; + + } +}; diff --git a/53_maximum_subarray/step2.cpp b/53_maximum_subarray/step2.cpp new file mode 100644 index 0000000..06dbcb5 --- /dev/null +++ b/53_maximum_subarray/step2.cpp @@ -0,0 +1,35 @@ +class Solution1 { +public: + int maxSubArray(vector& nums) { + if (nums.empty()) { + return 0; // error + } + int max_subarray_sum = nums[0]; + int subarray_sum = nums[0]; + for (int i = 1; i < nums.size(); ++i) { + int num = nums[i]; + subarray_sum = std::max(num, subarray_sum + num); + max_subarray_sum = std::max(max_subarray_sum, subarray_sum); + } + return max_subarray_sum; + + } +}; + + +class Solution { +public: + int maxSubArray(vector& nums) { + if (nums.empty()) { + return 0; // error + } + int max_subarray_sum = std::numeric_limits::min(); + int subarray_sum = 0; + for (auto num : nums) { + subarray_sum = std::max(num, subarray_sum + num); + max_subarray_sum = std::max(max_subarray_sum, subarray_sum); + } + return max_subarray_sum; + + } +}; diff --git a/53_maximum_subarray/step3.cpp b/53_maximum_subarray/step3.cpp new file mode 100644 index 0000000..e69de29 From 4e608d78ed87b2489f6b1fb445fe7a2f10d3bb71 Mon Sep 17 00:00:00 2001 From: ryosuketc <43229670+ryosuketc@users.noreply.github.com> Date: Wed, 19 Nov 2025 05:29:18 +0900 Subject: [PATCH 2/2] Remove blank lines --- 53_maximum_subarray/step1.cpp | 2 -- 53_maximum_subarray/step2.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/53_maximum_subarray/step1.cpp b/53_maximum_subarray/step1.cpp index ab9a141..18f5138 100644 --- a/53_maximum_subarray/step1.cpp +++ b/53_maximum_subarray/step1.cpp @@ -17,7 +17,6 @@ class Solution { max_subarray_sum = std::max(max_subarray_sum, subarray_sum); } return max_subarray_sum; - } }; @@ -41,6 +40,5 @@ class SolutionAC { max_subarray_sum = std::max(max_subarray_sum, subarray_sum); } return max_subarray_sum; - } }; diff --git a/53_maximum_subarray/step2.cpp b/53_maximum_subarray/step2.cpp index 06dbcb5..d62a1bd 100644 --- a/53_maximum_subarray/step2.cpp +++ b/53_maximum_subarray/step2.cpp @@ -12,7 +12,6 @@ class Solution1 { max_subarray_sum = std::max(max_subarray_sum, subarray_sum); } return max_subarray_sum; - } }; @@ -30,6 +29,5 @@ class Solution { max_subarray_sum = std::max(max_subarray_sum, subarray_sum); } return max_subarray_sum; - } };