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;
}
}