題目
看了卡哥的影片後,寫了如下程式碼:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int i = 0, j = 0;
for (j = 0; j < nums.size(); j ++ )
{
sum += nums[j];
while (sum >= target)
{
result = min(result, j - i + 1);
sum -= nums[i ++ ];
}
}
return result == INT32_MAX ? 0 : result;
}
};
幾個注意點:
-
因為是求最小值,所以將
result
初始化為INT32_MAX
,同時與min
函式配合,求出答案。 -
注意此題的
i
不會回溯,i
是一直向前走的,j
是一直向後走的。為什麼
i
是一直向前走的?當改變
j
的值時(即j ++
),i
不會重新賦值為0,因為我們要求的是長度最小的子陣列,將i
賦值為0沒有意義(為什麼沒意義?因為從0到還沒賦值為0的那個i
都不會導致比上一個result
更優的result
,應該從還沒賦值為0的那個i
的後一個位置開始考慮) -
應該是
while (sum >= target)
而不是while (sum > target)
因為
sum == target
的時候對應的i
,j
可能對應著答案,我們要讓sum == target
這個情況進入while處理。