パワーボタン1343の質問、配列、スライディングウィンドウソリューション
問題
整数の配列 arr と2つの整数 k と threshold が与えられます。
平均値がしきい値以上である長さ k の部分配列の数を返すように要求されます。
入力: arr = [2,2,2,2,5,5,8], k = 3, threshold = 4 出力: 3
解説:部分配列[2,5,5]、[5,5,5]、[5,5,8]の平均値はそれぞれ4、5、6。長さ3の他の部分配列はすべて平均値が4(しきい値の値)より小さい。
入力: arr = [1,1,1,1,1,1], k = 1, threshold = 0 出力: 5
入力: arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5 出力: 6
説明:長さ3の最初の6つの部分配列の平均は5より大きい。平均は整数ではないことに注意してください。
入力: arr = [7,7,7,7,7,7,7,7,7], k = 7, しきい値 = 7 出力: 1
入力: arr = [4,4,4,4], k = 4, threshold = 1 出力: 1
ヒント
- 1 <= arr.length <= 10^5
- 1 <= arr[i] <= 10^4
- 1 <= k <= arr.length
- <= threshold <= 10^4
var numOfSubarrays = function(arr, k, threshold) {
// 現在のウィンドウに格納されている要素の合計
// 此处将sums / k >= threshold, 和に変換する >= k * threshold
let sums = 0;
// ターゲットの戻り値
let nums = 0;
const len = arr.length;
// ターゲット・サム
const target = k * threshold;
// 一定不符合的参数直接return 0
if (arr.length < k) return 0;
// ウィンドウの最初の位置
for (let i = 0; i < k; i++) {
sums += arr[i];
}
// 最初の位置のウィンドウが条件を満たすかどうかを判定する
if (sums >= target) nums++;
// ウィンドウをスライドさせ、その都度前のビットを削除し、次のビットを追加する。
for (let i = k; i < len; i++) {
// 最後のビットを追加する
sums += arr[i];
// 最初のビットを取り除く
sums -= arr[i - k];
// このスライドの部分配列が有効かどうかを判定する
if (sums >= target) nums++;
}
return nums;
};