[JSアルゴリズム] 209. 最小の長さの部分配列

トピック

ここに画像の説明を挿入

一連の考え

1. 暴力的な解法
すべての部分列を走査し、条件を満たす最小の部分列を選択する
2. スライディング ウィンドウ
スライディング ウィンドウとは、考えた結果を得るために部分列の開始位置と終了位置を継続的に更新するプロセスです。図に示されています。

画像はコードカプリスより引用

画像の説明を追加してください

特定のコード

ブルートフォースソリューション

var minSubArrayLen = function(target, nums) {
    
    
    // 因为要得到最小数,所以初始化为最大的数
    let res = Number.MAX_VALUE

    for (let i = 0; i < nums.length; i++) {
    
    
        // 用来记录子数组加起来的值
        let num = 0;
        for (let j = i; j < nums.length; j++) {
    
    
            num += nums[j]
            // 符合条件的那一刻,比较此时的答案是否是最小
            // 因为再加下去就算符合条件也肯定比刚刚符合的那一刻大,所以进行break
            if (num >= target) {
    
    
                res = j + 1 - i < res ?  j + 1 - i : res;
                break;
            }
        }
    }
    // 如果res没有变化,说明整个数组没有符合条件的子数组
    if (res === Number.MAX_VALUE) {
    
    
        return 0;
    }
    return res;
};

この強引な解決策は、一定の判断も行われるため、サイクル数を削減するため、Likou で使用できます。
ここに画像の説明を挿入

スライドウィンドウ

var minSubArrayLen = function(target, nums) {
    
    

    // 因为要得到最小数,所以初始化为最大的数
    let res = Number.MAX_VALUE

    // 定义窗口左右边界
    let right = 0,left = 0,num = 0;

   while (right < nums.length) {
    
    
    // 不断地移动右边界
        num += nums[right]

        // 当符合条件时进行答案最小值得判断,并移动左边界从而得到这个情况的最小答案
        while (num >= target) {
    
    
            res = right + 1 - left < res ?  right + 1 - left : res;
            num -= nums[left]
            left++;
        }
        right++;
   }

   return res == Number.MAX_VALUE? 0 : res;
};

おすすめ

転載: blog.csdn.net/Cuichenyang158/article/details/130184630