Sliding Window on Arrays in DSA Java - Time & Space Complexity
We want to understand how the time needed changes when using the sliding window technique on arrays.
Specifically, how does the number of steps grow as the array gets bigger?
Analyze the time complexity of the following code snippet.
public int maxSumSubarray(int[] arr, int k) {
int maxSum = 0, windowSum = 0;
for (int i = 0; i < k; i++) {
windowSum += arr[i];
}
maxSum = windowSum;
for (int i = k; i < arr.length; i++) {
windowSum += arr[i] - arr[i - k];
if (windowSum > maxSum) {
maxSum = windowSum;
}
}
return maxSum;
}
This code finds the maximum sum of any subarray of size k using a sliding window.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two loops that each run over parts of the array.
- How many times: First loop runs k times, second loop runs (n - k) times, where n is array length.
As the array size grows, the total steps grow roughly in a straight line with n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The work grows directly with the size of the array.
Time Complexity: O(n)
This means the time needed grows in a straight line as the array gets bigger.
[X] Wrong: "The sliding window always takes more time because it has two loops inside."
[OK] Correct: The two loops together still only go through the array once, so the total time grows linearly, not more.
Understanding sliding window time complexity helps you explain efficient solutions clearly and confidently in interviews.
"What if we changed the window size k to vary with n, like k = n/2? How would the time complexity change?"
Practice
Solution
Step 1: Understand the sliding window concept
The sliding window technique moves a fixed-size window over the array to avoid repeated calculations.Step 2: Identify the main use case
It helps find sums or other properties of subarrays efficiently by updating the window incrementally.Final Answer:
To efficiently find subarray sums or properties without recomputing everything -> Option AQuick Check:
Sliding window = efficient subarray calculation [OK]
- Confusing sliding window with sorting
- Thinking it reverses the array
- Assuming it finds max element globally
arr?Solution
Step 1: Check loop boundaries for summing first k elements
The loop should run from 0 to k-1 to include exactly k elements.Step 2: Verify each option's loop range
int sum = 0; for(int i = 0; i < k; i++) sum += arr[i]; loops i from 0 to less than k, summing arr[0] to arr[k-1], which is correct.Final Answer:
int sum = 0; for(int i = 0; i < k; i++) sum += arr[i]; -> Option DQuick Check:
Loop 0 to k-1 sums first k elements [OK]
- Using <= k causes out-of-bound errors
- Starting loop from 1 misses first element
- Initializing sum with arr[0] and looping incorrectly
int[] arr = {1, 3, 2, 6, -1, 4, 1, 8, 2};
int k = 5;
int maxSum = 0, windowSum = 0;
for(int i = 0; i < k; i++) {
windowSum += arr[i];
}
maxSum = windowSum;
for(int i = k; i < arr.length; i++) {
windowSum += arr[i] - arr[i - k];
if(windowSum > maxSum) {
maxSum = windowSum;
}
}
System.out.println(maxSum);Solution
Step 1: Calculate initial window sum for first 5 elements
Sum of arr[0..4] = 1+3+2+6+(-1) = 11Step 2: Slide window and update maxSum
i=5: windowSum=11+4-1=14, maxSum=14
i=6: windowSum=14+1-3=12, maxSum=14
i=7: windowSum=12+8-2=18, maxSum=18
i=8: windowSum=18+2-6=14, maxSum=18Final Answer:
18 -> Option CQuick Check:
Max sliding window sum = 18 [OK]
- Not subtracting the element leaving the window
- Incorrect initial sum calculation
- Updating maxSum incorrectly
int maxSum = 0;
int windowSum = 0;
for(int i = 0; i <= k; i++) {
windowSum += arr[i];
}
maxSum = windowSum;
for(int i = k; i < arr.length; i++) {
windowSum += arr[i] - arr[i - k];
if(windowSum > maxSum) {
maxSum = windowSum;
}
}
System.out.println(maxSum);Solution
Step 1: Check the first loop boundary
The first loop runs i from 0 to k inclusive, which sums k+1 elements causing out-of-bounds error.Step 2: Correct loop boundary
The loop should run from 0 to less than k to sum exactly k elements.Final Answer:
The first loop should run from i = 0 to i < k, not i <= k -> Option AQuick Check:
Loop boundary off by one causes error [OK]
- Using <= k causes array index out of bounds
- Incorrect initialization of maxSum
- Wrong start index in second loop
target. Which approach correctly solves this problem?Solution
Step 1: Understand the problem constraints
We want the longest subarray with sum ≤ target, which requires dynamic window size.Step 2: Apply sliding window with two pointers
Use two pointers to expand the window adding elements, shrink from left when sum > target, track max length.Final Answer:
Use two pointers to expand and shrink the window, updating max length when sum ≤ target -> Option BQuick Check:
Two-pointer sliding window finds longest valid subarray [OK]
- Sorting breaks original order, invalid for subarrays
- Nested loops are inefficient for large arrays
- Stack is not suitable for sum-based sliding window
Ready to prove it?
Pass the test and this pattern moves unknown
