Siding window is a method for iterating over a linear collection by maintaining a window range indices (a group of consecutive elements) to satisfy the problem constraints
Sliding window is an improvement over brute force iteration to reduce the time complexity
Problem
Given an array A and a number k
Write an algorithm to find the maximum sum of k consecutive elements in A
Example
Input: [5, 7, 2, 9, 4] and 2
Expected output: 13
Explanation: 9 and 4 are 2 consecutive elements have maximum sum
Approach 1: Brute force
- Iterating over
a
one by one element to find max sum
public class SubarrayMaxSumBruteforce {
public static int maxSumBruteforce(int[] A, int k) {
int maxSum = Integer.MIN_VALUE;
for (int i = 0; i < A.length - k + 1; i++) {
int currentSum = 0;
for (int j = 0; j < k; j++) {
currentSum += A[i+j];
}
if (currentSum > maxSum) maxSum = currentSum;
}
return maxSum;
}
public static void main(String[] args) {
System.out.println(maxSumBruteforce(new int[]{5, 7, 2, 9, 4}, 2));
}
}
- Output
13
Time complexity: O(n*k)
Space complexity: O(1)
Approach 2: Sliding window
- Iterating over
a
window by window to find max sum
public class SubarrayMaxSumWindowSliding {
public static int maxSumWindowSliding(int[] A, int k) {
int windowsSum = 0, maxSum = Integer.MIN_VALUE;
for (int i = 0; i < k; i++) {
windowsSum += A[i];
}
for (int i = k; i < A.length; i++) {
windowsSum += A[i] - A[i-k];
if (windowsSum > maxSum) maxSum = windowsSum;
}
return maxSum;
}
public static void main(String[] args) {
System.out.println(maxSumWindowSliding(new int[]{-5, -7, -2, -9, -4}, 2));
}
}
- Output
-9
Time complexity: O(n)
Space complexity: O(1)