Conversation
|
|
||
| let sentinel_subarray_length: usize = nums.len() + 1; | ||
| let mut min_subarray_length = sentinel_subarray_length; | ||
| let mut prefix_sum = nums[0]; |
There was a problem hiding this comment.
prefix_sum という変数名からは、ある個所以前すべての総和というニュアンスを感じます。 step1 のように sum で十分伝わると思います。
| let mut sum = nums[0]; | ||
| let (mut start, mut end) = (0, 0); | ||
|
|
||
| while start <= end && end < nums.len() { |
There was a problem hiding this comment.
こちらのコメントをご参照ください。
garunitule/coding_practice#48 (comment)
| let (mut start, mut end) = (0, 0); | ||
|
|
||
| while start <= end && end < nums.len() { | ||
| if target <= sum { |
There was a problem hiding this comment.
ロジックの組み立て方と順番に違和感を感じました。
組み立て方については、ループの中で、状況に応じて異なる処理を行うという点に違和感を感じました。ステートマシン等、限られたイディオムにおいては自然に感じるのですが、 target <= sum で処理を切り替えるという点は不自然に感じました。ややパズルになっているようにも感じます。
また、 end += 1 してから end < nums.len() の場合に sum += nums[end] するという順番に違和感を感じました。自分なら、 end < nums.len() なしで sum += nums[end] ができないかと考えたり、 sum += nums[end] してからend += 1 したほうが自然ではないかと感じます。
自分は Rust が書けないため、 C++ で上記を踏まえたコードを書いてみます。
int minSubArrayLen(int target, vector<int>& nums) {
if (nums.empty()) {
return 0;
}
int min_length = std::numeric_limits<int>::max();
int sum = 0;
int start = 0;
for (int end = 0; end < nums.size(); ++end) {
sum += nums[end];
while (sum >= target) {
min_length = std::min(min_length, end - start + 1);
sum -= nums[start];
++start;
}
}
if (min_length == std::numeric_limits<int>::max()) {
return 0;
}
return min_length;
}There was a problem hiding this comment.
ありがとうございます。
提案頂いたコードと比べてみると元のコードがループの中で場当たり的に条件分岐していると感じました。
提案頂いたコードを写経してみたところ、すっきりと書けるなと思いました。
pub fn min_sub_array_len(target: i32, nums: Vec<i32>) -> i32 {
let mut min_length = i32::MAX;
let mut sum = 0;
let mut start = 0;
for end in 0..nums.len() {
sum += nums[end];
while target <= sum {
min_length = min_length.min((end - start) as i32 + 1);
sum -= nums[start];
start += 1;
}
}
if min_length == i32::MAX {
return 0;
}
min_length
}
問題: 209. Minimum Size Subarray Sum
次に解く問題: 46. Permutations
ファイルの構成:
./src/bin/<各ステップ>.rs