子数组之和
题目
给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置
样例
给出 [-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].
题解
本题为了达到O(n)的时间复杂度,使用了HashMap以空间换时间。具体思路如下:先遍历一遍,获取nums的累加数组sum[],sum[i] = nums[0]+…+nums[i]。如果有任意sum[i]==0,或者sum[i]==sum[j],则可判断找到和为零的子数组。这里用HashMap来取代第二个for循环。
public class Solution {
/**
* @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
*/
public ArrayList<Integer> subarraySum(int[] nums) {
ArrayList<Integer> result = new ArrayList<Integer>();
HashMap<Integer,ArrayList<Integer>> hash = new HashMap<>();
for (int i=0,sum=0;i<nums.length;i++)
{
sum += nums[i];
ArrayList<Integer> v = hash.get(sum);
if (v == null)
{
v = new ArrayList<Integer>();
}
v.add(i);
hash.put(sum,v);
}
for (Map.Entry<Integer,ArrayList<Integer>> entry : hash.entrySet())
{
Integer k = entry.getKey();
ArrayList<Integer> v = entry.getValue();
if (k == 0)
{
result.add(0);
result.add(v.get(0));
break;
}
if (v.size() > 1)
{
for (int i=0;i<v.size()-1;i++)
{
for (int j=i+1;j<v.size();j++)
{
result.add(v.get(i)+1);
result.add(v.get(j));
return result;
}
}
}
}
return result;
}
}
Last Update 2016.9.7