Sliding Window是在一筆連續資料中,比對加總值最大/最小的一個演算法
const maxSum = (arr, size) => {
if (size > arr.length) return null;
let firstIndex = 0;
const lastIndex = arr.length - size;
let result = 0;
for (let i = firstIndex; i <= lastIndex; i++) {
let amount = 0;
for (let times = i; times < size + i; times++) {
amount += arr[times];
}
// maxSum
result = result <= amount ? amount : result;
}
return result;
};
console.log(maxSum([2, 7, 3, 0, 6, 1, -5, -12, -11], 3)); // 12
使用兩個for loop比對,先取出第一個值,之後的每次循環都比對上一次的直,保留最大/最小值…,直覺地寫出O(n^2)
// improved
// 算出每個累加size的大小,在和下一個比較(size + 1再減去第一筆)
const improvedMaxSum = (arr, size) => {
if (size > arr.length) return null;
let resultValue = 0;
for (let i = 0; i < size; i++) {
// 處理第一筆累加
resultValue += arr[i];
}
// 存取第一次loop加總結果
let currentValue = resultValue;
for (let i = size; i < arr.length; i++) {
// arr[i]為當前加總下一筆值
// arr[i - size]為當前加總需扣除的第一筆值
// currentValue每個loop都會被更新
currentValue = currentValue + arr[i] - arr[i - size];
if (currentValue > resultValue) resultValue = currentValue;
}
return resultValue;
};
console.log(improvedMaxSum([2, 7, 3, 0, 6, 1, 5, 12, 11], 3)); // 28