LeetCode P209:長度最小的子數組

LeetCode P209:長度最小的子數組

給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中滿足其和 ≥ s 的長度最小的連續子數組,並返回其長度。如果不存在符合條件的連續子數組,返回 0。

示例

輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子數組 [4,3] 是該條件下的長度最小的連續子數組。

關鍵詞:求滿足條件的連續子數組,雙指針(滑動窗口O(n))

解題思路

  • 連續子數組可以表示爲 [i,j]:從第 i 項到第 j 項
  • 如果窗口的 sum >= s ,如果擴張窗口,條件依然滿足,但更背離“最小長度”的要求
    - 所以選擇收縮窗口,i 右移,直到條件不再滿足,所以這裏是一個循環
    - 在循環中,將窗口長度和全局的最小比較
  • 如果窗口不再 sum >= s ,此時應該擴張窗口,直到條件重新滿足

滑動窗口的套路

  • 擴張窗口:找可行解的過程,找到了就不再擴張
  • 收縮窗口:在長度上優化該可行解,直到條件被破壞
  • 然後尋找下一個可行解,然後再優化……

Java實現

class Solution {
    /**
     * 連續最小數組:移動窗口
     * @param s
     * @param nums
     * @return
     */
    public int minSubArrayLen(int s, int[] nums) {
        int minLen = Integer.MAX_VALUE;
        int left = 0;  //左指針
        int sum = 0;
        for (int i = 0; i < nums.length ; i++) {   //i爲右指針,擴張窗口
            sum += nums[i];
            while (sum >= s){
                minLen = Math.min(minLen,i - left + 1); //記錄長度
                //收縮窗口
                sum -= nums[left];
                left++;
            }

        }
        return minLen == Integer.MAX_VALUE ? 0 : minLen;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章