Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions 209/209.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
## 何も見ずに解いてみる

```cpp
class Solution {
public:
int minSubArrayLen(int target, vector<int>& 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<int>::max()の方が安全らしいが書くのが面倒・・・

試しにwhile文とインクリメントを使って書いてみる。あんまり読みやすくはないかも。

```cpp
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int start = 0;
int end = 0;
int sum = 0;
int min_length = std::numeric_limits<int>::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<int>::max()) {
return 0;
}
return min_length;
}
};
```

## 最終コード

```cpp
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int min_length = std::numeric_limits<int>::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;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

冒頭に書かれたコードより、こちらの while 文の方が読みやすく感じました。

}
if (min_length == std::numeric_limits<int>::max()) {
return 0;
}
return min_length;
}
};
```