From f2be48a42b9bb2b0a886b624b3233f4438dde3e5 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Wed, 5 Mar 2025 14:39:47 +0900 Subject: [PATCH] finish --- 209.MinimumSizeSubarraySum/cumulative_sum.cpp | 32 +++++++++++++++ 209.MinimumSizeSubarraySum/memo.md | 40 +++++++++++++++++++ 209.MinimumSizeSubarraySum/step1.cpp | 27 +++++++++++++ 209.MinimumSizeSubarraySum/step2.cpp | 27 +++++++++++++ 209.MinimumSizeSubarraySum/step2_2.cpp | 30 ++++++++++++++ 209.MinimumSizeSubarraySum/step3.cpp | 26 ++++++++++++ 6 files changed, 182 insertions(+) create mode 100644 209.MinimumSizeSubarraySum/cumulative_sum.cpp create mode 100644 209.MinimumSizeSubarraySum/memo.md create mode 100644 209.MinimumSizeSubarraySum/step1.cpp create mode 100644 209.MinimumSizeSubarraySum/step2.cpp create mode 100644 209.MinimumSizeSubarraySum/step2_2.cpp create mode 100644 209.MinimumSizeSubarraySum/step3.cpp diff --git a/209.MinimumSizeSubarraySum/cumulative_sum.cpp b/209.MinimumSizeSubarraySum/cumulative_sum.cpp new file mode 100644 index 0000000..4e36808 --- /dev/null +++ b/209.MinimumSizeSubarraySum/cumulative_sum.cpp @@ -0,0 +1,32 @@ +class Solution { + public: + int minSubArrayLen(int target, vector& nums) { + vector cumulative_sum(nums.size() + 1); + cumulative_sum[0] = 0; + for (int i = 0; i < nums.size(); i++) { + cumulative_sum[i + 1] = cumulative_sum[i] + nums[i]; + } + + int min_length = NOANSWER; + int left = 0; + int right = 1; + while (right < cumulative_sum.size()) { + while (left < right) { + if (cumulative_sum[right] - cumulative_sum[left] < target) { + break; + } + min_length = min(min_length, right - left); + left++; + } + right++; + } + + if (min_length == NOANSWER) { + return 0; + } + return min_length; + } + + private: + static constexpr int NOANSWER = numeric_limits::max(); + }; \ No newline at end of file diff --git a/209.MinimumSizeSubarraySum/memo.md b/209.MinimumSizeSubarraySum/memo.md new file mode 100644 index 0000000..7de7ada --- /dev/null +++ b/209.MinimumSizeSubarraySum/memo.md @@ -0,0 +1,40 @@ +## ステップ1 +一度解いたことがあり解き方を覚えていた。 +左側のインデックスをleft、右側のインデックスをrightとする。 +変数sumにleftからright区間の合計値を持たせておいて、 +sumがtargetを超える場合はleftを進める。target以下の間はrightを進める。 + +## ステップ2 +左側をループで回す方法がありstep2_2で実装。 +右側をループで回す方が直感的な気がする。 + +累積和で解くことも可能、cumulative_sum.cppで実装 +>nums は役割を全うして prefix_sum が代わりに進む準備ができた +>prefix_sum の left, right を使って考える +自分のこの考え方がしっくりきました +https://github.com/Yoshiki-Iwasa/Arai60/pull/43/commits/4423fb7f61bb4507ed7846c0964b0832b5d387de + +累積和を作る際にprefixSums[i] = prefixSums[i - 1] + nums[i - 1];を使っている。 +ここは好みの問題か +https://github.com/goto-untrapped/Arai60/pull/40 + +## ステップ3 +**3回書き直しやりましょう、といっているのは、不自然なところや負荷の高いところは覚えられないからです。** + +## 他の方の解法 +leetcodeの解答例でsum += nums[r++];というふうにインクリメントしながらsumに追加する方法があった。 +1行に2つの処理を纏めるより分けた方が好み。 + +Pythonのmath.infは型がfloat。言語が変わるとこの辺りの仕様は理解しておかないとバグに繋がりそう。 +右側をループで回す方法で解いたが、左側を回す方法もあり。 +余談、cumulative sumを略してcum sumというの知らなかった。。。 +https://github.com/fhiyo/leetcode/pull/49 + +numsに負の値が入ってきたときを考える +→自分のコードだと動かない + sum -= nums[left];の際に意図しない挙動になる。 +https://github.com/goto-untrapped/Arai60/pull/40 +https://github.com/Mike0121/LeetCode/pull/22 + +## Discorなど + diff --git a/209.MinimumSizeSubarraySum/step1.cpp b/209.MinimumSizeSubarraySum/step1.cpp new file mode 100644 index 0000000..89ae2c5 --- /dev/null +++ b/209.MinimumSizeSubarraySum/step1.cpp @@ -0,0 +1,27 @@ +class Solution { + public: + int minSubArrayLen(int target, vector& nums) { + int min_length = NOANSWER; + int sum = 0; + + int left = 0; + for (int right = 0; right < nums.size(); right++) { + sum += nums[right]; + while (sum >= target) { + min_length = min(min_length, right - left + 1); + sum -= nums[left]; + left++; + } + } + + if (min_length != NOANSWER) { + return min_length; + } else { + return 0; + } + } + + private: + static constexpr int NOANSWER = numeric_limits::max(); + }; + \ No newline at end of file diff --git a/209.MinimumSizeSubarraySum/step2.cpp b/209.MinimumSizeSubarraySum/step2.cpp new file mode 100644 index 0000000..8868f29 --- /dev/null +++ b/209.MinimumSizeSubarraySum/step2.cpp @@ -0,0 +1,27 @@ +class Solution { + public: + int minSubArrayLen(int target, vector& nums) { + int min_length = NOANSWER; + + int sum = 0; + int left = 0; + for (int right = 0; right < nums.size(); right++) { + sum += nums[right]; + + while (sum >= target) { + min_length = min(min_length, right - left + 1); + sum -= nums[left]; + left++; + } + } + + if (min_length == NOANSWER) { + return 0; + } + return min_length; + } + + private: + static constexpr int NOANSWER = numeric_limits::max(); + }; + \ No newline at end of file diff --git a/209.MinimumSizeSubarraySum/step2_2.cpp b/209.MinimumSizeSubarraySum/step2_2.cpp new file mode 100644 index 0000000..f451451 --- /dev/null +++ b/209.MinimumSizeSubarraySum/step2_2.cpp @@ -0,0 +1,30 @@ +class Solution { + public: + int minSubArrayLen(int target, vector& nums) { + int min_length = NOANSWER; + int sum = 0; + + int right = 0; + for (int left = 0; left < nums.size(); left++) { + while (right < nums.size() && sum < target) { + sum += nums[right]; + right++; + } + if (sum < target) { + break; + } + min_length = min(min_length, right - left); + sum -= nums[left]; + } + + if (min_length != NOANSWER) { + return min_length; + } else { + return 0; + } + } + + private: + static constexpr int NOANSWER = numeric_limits::max(); + }; + \ No newline at end of file diff --git a/209.MinimumSizeSubarraySum/step3.cpp b/209.MinimumSizeSubarraySum/step3.cpp new file mode 100644 index 0000000..dcc1e2c --- /dev/null +++ b/209.MinimumSizeSubarraySum/step3.cpp @@ -0,0 +1,26 @@ +class Solution { + public: + int minSubArrayLen(int target, vector& nums) { + int min_length = NOANSWER; + int sum = 0; + + int left = 0; + for (int right = 0; right < nums.size(); right++) { + sum += nums[right]; + while (sum >= target) { + min_length = min(min_length, right - left + 1); + sum -= nums[left]; + left++; + } + } + + if (min_length == NOANSWER) { + return 0; + } + return min_length; + } + + private: + static constexpr int NOANSWER = numeric_limits::max(); + }; + \ No newline at end of file