给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置。
样例
给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].
class Element implements Comparable<Element>{
int val;
int index;
public Element(int v, int i)
{
val=v;
index=i;
}
public int compareTo(Element other)
{
return this.val-other.val;
}
public int getIndex()
{
return index;
}
public int getValue()
{
return val;
}
}
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> res=new ArrayList<Integer>();
if(nums.length==0)
return res;
Element[] sums=new Element[nums.length+1];
sums[0]=new Element(0,-1);
int sum=0;
for (int i=0;i<nums.length;i++)
{
sum+=nums[i];
sums[i+1]=new Element(sum,i);
}
Arrays.sort(sums);
int min=Math.abs(sums[0].getValue()-sums[1].getValue());
int start=Math.min(sums[0].getIndex(),sums[1].getIndex())+1;
int end=Math.max(sums[0].getIndex(),sums[1].getIndex());
for(int i=1;i<nums.length;i++){
int diff=Math.abs(sums[i].getValue()-sums[i+1].getValue());
if (diff<min)
{
min=diff;
start=Math.min(sums[i].getIndex(),sums[i+1].getIndex())+1;
end =Math.max(sums[i].getIndex(),sums[i+1].getIndex());
}
}
res.add(start);
res.add(end);
return res;
}
}