203. 長度最小的子陣列

hisun9發表於2024-10-29

題目

看了卡哥的影片後,寫了如下程式碼:

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的時候對應的ij可能對應著答案,我們要讓sum == target這個情況進入while處理。

相關文章