滑動視窗(209長度最小的子陣列)
阿新 • • 發佈:2022-03-31
給定一個含有 n 個正整數的陣列和一個正整數 target 。
找出該陣列中滿足其和 ≥ target 的長度最小的 連續子陣列 [numsl, numsl+1, ..., numsr-1, numsr] ,並返回其長度。如果不存在符合條件的子陣列,返回 0 。
輸入:target = 7, nums = [2,3,1,2,4,3] 輸出:2 解釋:子陣列[4,3]
是該條件下的長度最小的子陣列。
暴力解法利用雙迴圈
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int length = 0;//記錄當前長度
int result = Integer.MAX_VALUE;//記錄最小長度
for (int i = 0; i < nums.length; i++) {
int sum = 0;
for (int j = i; j < nums.length; j++) {
sum += nums[j];
if (sum >= target) {
length = j - i + 1;
result = result < length ? result : length;
break;
}
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
優化:滑動視窗
所謂滑動視窗,就是不斷的調節子序列的起始位置和終止位置,從而得出我們要想的結果。
class Solution { public int minSubArrayLen(int target, int[] nums) { int left = 0;//起始地址 int sum = 0; int result = Integer.MAX_VALUE; for (int right = 0; right < nums.length; right++) { sum += nums[right];//for迴圈控制視窗長度 while (sum >= target) { result = Math.min(result, right - left + 1); sum -= nums[left++];//每當sum>=target的時候, 求得序列長度j - i + 1;和result進行比較,讓result存入最小值, 刪除起始地址所對應的值,並將起始位置向後挪動一位。 } } return result == Integer.MAX_VALUE ? 0 : result; } }