Professional Documents
Culture Documents
Interview Camp
Technique: Prefix Sums
Level: Medium
Given an array of integers, both -ve and +ve, find a contiguous subarray that sums to a number
X.
For example: [2,4,-2,1,-3,5,-3], X = 5 --> Result = [2,4,-2,1]
Questions to Clarify:
Q. How should I return the output?
A. Return the starting and ending indices of the subarray.
Q. What to return if the array is empty or null?
A. Return null.
Q. What to return if no subarray is found?
A. Return null.
Q. What to do if there are multiple subarrays?
A. Return any one.
Solution:
This is a small modification of the problem we explained in the video. In fact, we just
modify a few parameters to make this work.
In the video solution, we were looking for the sum 0. Here, instead of 0, we're looking for X.
While we maintain the prefix sum, if the prefix sum is equal to X, we know that a[0..i] is the
resulting subarray.
Now here's the important part - if we have previously encountered current_prefix_sum - X,
i.e, it is in our hash map at some index p, that means a[p+1..i] is our result.
Why does this work? Because from index p+1 to i, our sum increased by X. So that subarray has
a sum of X.
Pseudocode:
(Note: Never write pseudocode in an actual interview. Unless you're writing a
few lines quickly to plan out your solution. Your actual solution should be in
a real language and use good syntax.)
Same as before: We loop through the array, and at each index i, we update prefix sum. If we
encounter sum X at i, we return [0..i] as answer. We also keep a map of old sums. If we find
sum-X at index p, we return the subarray [p+1..i] as the answer.
© 2017 Interview Camp (interviewcamp.io)
Interview Camp
Note: In our code, we use the variable name target instead of X, because it's
more descriptive.
sum = 0
hashmap map = {}
for i -> 0 to a.length - 1:
sum = sum + a[i]
if sum == target:
return [0..i]
Test Cases:
Edge Cases: Empty Array, Null array
Base Cases: single element (-ve, +ve, 0)
Regular Cases: has sum, does not have sum, has sum at beginning/end/middle
int sum = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < a.length; i++) {
sum += a[i];
if (sum == target) {
return new Pair<Integer>(0,i);
}
if (map.containsKey(sum - target)) {
return new Pair<Integer>(map.get(sum - target) + 1, i);
}
map.put(sum, i);
}
© 2017 Interview Camp (interviewcamp.io)