JavaScript 查找具有最小平均值的子数组
我们要写一个程序,找到具有最小平均值的子数组。为了做到这一点,我们将遍历数组,并跟踪当前子数组及其总和。对于每个元素,我们将计算当前子数组的平均值,并将其与迄今为止看到的最小平均值进行比较。如果更低,我们将更新最小平均值和子数组的起始和结束索引。在迭代结束时,我们将返回具有最小平均值的子数组。
方法
要找到具有最小平均值的子数组,可以按照以下步骤进行:
- 初始化两个变量start和end,用于跟踪子数组的起始和结束索引。
-
使用for循环遍历数组,同时跟踪当前总和和迄今为止找到的最小平均值。
-
在每次迭代时,将当前总和与最小平均值进行比较,并在找到新的最小平均值时更新start和end变量。
-
如果当前总和大于最小平均值,则将起始索引向前移动,直到总和小于最小平均值为止。
-
重复步骤2-4,直到到达数组的末尾。
-
具有最小平均值的子数组是从start开始到end结束的子数组。
示例
给定一个整数数组,找到具有最小平均值的子数组。
以下是使用JavaScript解决这个问题的完整示例代码。
function findsmallestAverageSubarray(arr, k) {
let minAvg = Number.POSITIVE_INFINITY;
let minAvgStart = 0;
let windowSum = 0;
for (let i = 0; i < arr.length - k + 1; i++) {
if (i === 0) {
for (let j = 0; j < k; j++) {
windowSum += arr[j];
}
} else {
windowSum -= arr[i - 1];
windowSum += arr[i + k - 1];
}
let windowAvg = windowSum / k;
if (windowAvg < minAvg) {
minAvg = windowAvg;
minAvgStart = i;
}
}
return arr.slice(minAvgStart, minAvgStart + k);
}
const arr = [1, 3, 6, -3, -4, 2, 5];
const k = 4;
console.log(findsmallestAverageSubarray(arr, k));
解释:
-
函数 findSmallestAverageSubarray 接受一个整数数组 arr 和一个整数 k 作为输入,其中 k 是子数组的长度。
-
该函数返回具有最小平均值的子数组。
-
minAvg 变量被初始化为浮点数的最大可能值。
-
minAvgStart 变量用于存储具有最小平均值的子数组的起始索引。
-
windowSum 变量用于存储当前子数组中元素的总和。
-
外部循环 for (let i = 0; i < arr.length – k + 1; i++) 用于遍历给定数组 arr 中长度为 k 的所有可能的子数组。
-
内部循环 for (let j = 0; j < k; j++) 用于计算当前子数组中元素的总和。
-
if (i === 0)
块用于计算第一个子数组中元素的总和。 -
else 块用于计算其余子数组中元素的总和。它减去前一个子数组的第一个元素,并加上当前子数组的最后一个元素。
-
windowAvg 变量用于存储当前子数组的平均值。
-
if (windowAvg < minAvg) 块用于更新最小平均值和具有最小平均值的子数组的起始索引。
-
最后,该函数返回具有最小平均值的子数组。