1. 程式人生 > 其它 >滑動視窗(209長度最小的子陣列)

滑動視窗(209長度最小的子陣列)

給定一個含有 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; } }