Sum 0
Given an array, find the longest sub-array that sums up to 0.
Solution
- It would be tempting to do recursion, and find all sub-arrays starting at each index (similar to the longest palindrome problem) and then find the longest - that's a O(n^2) algorithm
- Better algo is to track cumulative sum, if the sum has been seen before then we know that elements between current index and prev sum index adds up to 0 sum.
- Repeat this until we reach the end of the array and track the longest sub-array seen so far.
Code
def zero_sub_array(a)
return if a.nil?
sum = 0
max_len = 0
hash = {}
a.each.with_index do |e, i|
sum += e
if arr[i] == 0 && max_len == 0
max_len = 1
end
# Sum was previously seen before
if hash[sum]
prev_index = hash[sum]
max_len = [max_len, i - prev_index].max
else
hash[sum] = i
end
return max_len
end
end
Complexity
O(n)