138. Subarray Sum
Description:
Given an integer array, find a subarray where the sum of numbers is zero. Your code should return the index of the first number and the index of the last number.
Example
Example 1:
Input: [-3, 1, 2, -3, 4]
Output: [0, 2] or [1, 3].
Explanation: return anyone that the sum is 0.
Example 2:
Input: [-3, 1, -4, 2, -3, 4]
Output: [1,5]
Notice
There is at least one subarray that it’s sum equals to zero.
Main Idea:
Integer Array Problem. To reduce this running time from O(n^2) to O(n), we need to solve problem in a different way. Let’s comprehend in this way: if the sum of subarray is zero, which would be [i, j], it means the sums of [0, i-1] and [0, j+1] are the same. In this sense, all we need to do is recording the hash table of sum. Key would be the sum number, while the value would be the index.
Tips/Notes:
Time/Space Cost:
Time Cost: O ( n ) \ O(n) O(n)
Code:
class Solution {
public:
/**
* @param nums: A list of integers
* @return: A list of integers includes the index of the first number and the index of the last number
*/
vector<int> subarraySum(vector<int> &nums) {
// write your code here
if(nums.empty())
return nums;
vector<int> res;
int sum = 0;
unordered_map<int,int> hash;
hash[0] = 0;
for(int i = 0; i < nums.size(); i++){
sum += i;
// if there exists the sum before, then it's one of the answers.
if(hash.find(sum) != hash.end()){
// note there, the subarray begin from hash[sum] + 1.
res.push_back(hash[sum] + 1);
res.push_back(i);
}
// else, record this sum.
else
{
hash[sum] = i;
}
}
return res;
}
};