diff --git a/209/209.md b/209/209.md new file mode 100644 index 0000000..0739fce --- /dev/null +++ b/209/209.md @@ -0,0 +1,88 @@ +## 何も見ずに解いてみる + +```cpp +class Solution { +public: + int minSubArrayLen(int target, vector& nums) { + int start = 0; + int sum = 0; + int min_length = INT_MAX; + for (int end = 0; end < nums.size(); ++end) { + sum += nums[end]; + while (sum - nums[start] >= target) { + sum -= nums[start]; + ++start; + } + if (sum >= target) { + min_length = min(min_length, end - start + 1); + } + } + if (min_length == INT_MAX) { + return 0; + } + return min_length; + } +}; +``` + +## 他の人のコードを見てみる + +https://github.com/tokuhirat/LeetCode/pull/49/files +https://github.com/hayashi-ay/leetcode/pull/51/files +https://github.com/Fuminiton/LeetCode/pull/51/files +https://github.com/Ryotaro25/leetcode_first60/pull/53/files + +INT_MAXよリモstd::numeric_limits::max()の方が安全らしいが書くのが面倒・・・ + +試しにwhile文とインクリメントを使って書いてみる。あんまり読みやすくはないかも。 + +```cpp +class Solution { +public: + int minSubArrayLen(int target, vector& nums) { + int start = 0; + int end = 0; + int sum = 0; + int min_length = std::numeric_limits::max(); + while (end < nums.size()) { + while (sum < target && end < nums.size()) { + sum += nums[end++]; + } + while (sum >= target) { + min_length = min(min_length, end - start); + sum -= nums[start++]; + } + } + if (min_length == std::numeric_limits::max()) { + return 0; + } + return min_length; + } +}; +``` + +## 最終コード + +```cpp +class Solution { +public: + int minSubArrayLen(int target, vector& nums) { + int min_length = std::numeric_limits::max(); + int start = 0; + int sum = 0; + for (int end = 0; end < nums.size(); ++end) { + sum += nums[end]; + while (sum >= target) { + min_length = min(min_length, end - start + 1); + sum -= nums[start]; + ++start; + } + } + if (min_length == std::numeric_limits::max()) { + return 0; + } + return min_length; + } +}; +``` +