Sliding Window on Arrays in DSA Go - 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.
func maxSumSubarray(arr []int, k int) int {
maxSum := 0
windowSum := 0
for i := 0; i < k; i++ {
windowSum += arr[i]
}
maxSum = windowSum
for i := k; i < len(arr); 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 over the array elements.
- 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: Doubling the input roughly doubles the work done.
Time Complexity: O(n)
This means the time grows linearly with the size of the input array.
[X] Wrong: "The sliding window has nested loops, so it must be O(n²)."
[OK] Correct: The window moves forward by one step each time without redoing all work, so the total steps add up to n, not n squared.
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 sliding window concept
The sliding window technique moves a fixed-size window over the array to process subarrays efficiently.Step 2: Identify purpose
It avoids recalculating values for overlapping parts of subarrays, improving performance.Final Answer:
To efficiently process subarrays of fixed size without re-computing everything -> Option AQuick Check:
Sliding window = efficient subarray processing [OK]
- Confusing sliding window with sorting
- Thinking it reverses arrays
- Assuming it finds max of whole array
arr?Solution
Step 1: Check loop bounds for first 3 elements
Array indices start at 0, so first 3 elements are at indices 0,1,2. Loop must run i from 0 to less than 3.Step 2: Verify each option
sum := 0 for i := 0; i < 3; i++ { sum += arr[i] } loops i=0 to 2 correctly. Others either start at 1 or go out of bounds.Final Answer:
sum := 0 for i := 0; i < 3; i++ { sum += arr[i] } -> Option AQuick Check:
Loop i=0 to 2 sums first 3 elements [OK]
- Starting loop at 1 instead of 0
- Using <= instead of < causing out of bounds
- Incorrect loop end index
arr := []int{2, 1, 5, 1, 3, 2}
windowSize := 3
sum := 0
for i := 0; i < windowSize; i++ {
sum += arr[i]
}
result := []int{sum}
for i := windowSize; i < len(arr); i++ {
sum += arr[i] - arr[i-windowSize]
result = append(result, sum)
}
fmt.Println(result)Solution
Step 1: Calculate initial window sum
First 3 elements: 2+1+5=8. result = [8]Step 2: Slide window and update sums
i=3: sum=8 + arr[3](1) - arr[0](2) = 8+1-2=7; result=[8,7] i=4: sum=7 + arr[4](3) - arr[1](1) = 7+3-1=9; result=[8,7,9] i=5: sum=9 + arr[5](2) - arr[2](5) = 9+2-5=6; result=[8,7,9,6]Final Answer:
[8 7 9 6] -> Option CQuick Check:
Sliding sums = [8 7 9 6] [OK]
- Not subtracting the element leaving the window
- Appending sum before updating
- Incorrect initial sum calculation
arr := []int{1, 3, 2, 5, 1}
windowSize := 2
maxSum := 0
sum := 0
for i := 0; i < windowSize; i++ {
sum += arr[i]
}
for i := windowSize; i < len(arr); i++ {
sum += arr[i] - arr[i-windowSize]
if sum > maxSum {
maxSum = sum
}
}
fmt.Println(maxSum)Solution
Step 1: Check initial maxSum and first window sum
maxSum is 0, sum is sum of first 2 elements (1+3=4). But maxSum is not updated with this initial sum.Step 2: Identify missing comparison
The first window sum should be compared to maxSum before sliding the window, else maxSum remains 0 if all sums are less.Final Answer:
The first window sum is not compared to maxSum -> Option BQuick Check:
Compare initial sum to maxSum before loop [OK]
- Not updating maxSum with initial sum
- Wrong loop start index
- Incorrect sum update formula
k. Which approach correctly solves this problem?Solution
Step 1: Understand problem constraints
We want the longest subarray with sum ⤠k, which requires dynamic window size adjustment.Step 2: Choose sliding window with two pointers
Expand right pointer adding elements to sum; if sum > k, move left pointer to shrink window until sum ⤠k; track max length.Final Answer:
Use two pointers to expand and shrink the window, updating sum and max length accordingly -> Option DQuick Check:
Two-pointer sliding window adjusts size for sum ⤠k [OK]
- Sorting array breaks subarray order
- Checking all subarrays is inefficient
- Using stack is not suitable here
Ready to prove it?
Pass the test and this pattern moves unknown
