子数组之和

来源:互联网 发布:手机cad画图软件 编辑:程序博客网 时间:2024/04/30 07:44

  给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置。

  样例
  给出[-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;    }}

0 0