给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置
样例
给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].
思路:这道题最开始我的想法是用两重宣传去查找第一组连续数字和为0的两端,会发现这种情况算法的复杂度是O(n*n);应该是挺复杂的方法;之后又看到了这样的算法,我们从第一个开始,把对于每一个元素而言的前n项和求出来,当出现sum(j)=sum(i)(j>i)时,即可认为第i+1项到第j项的总和为0;这是一个很巧妙的算法。所以我们建立一个前n项和的数组,并且进行一次排序即可得到结果。复杂程度为O(nlogn)
1 class Element implements Comparable<Element>{ 2 int index; 3 int value; 4 public Element (int i,int v){ 5 index = i; 6 value = v; 7 } 8 public int compareTo(Element other){ 9 return this.value-other.value; 10 } 11 public int getIndex(){ 12 return index; 13 } 14 public int getValue(){ 15 return value; 16 } 17 } 18 public class Solution { 19 /** 20 * @param nums: A list of integers 21 * @return: A list of integers includes the index of the first number 22 * and the index of the last number 23 */ 24 public ArrayList<Integer> subarraySum(int[] nums) { 25 // write your code here 26 ArrayList<Integer> res = new ArrayList<Integer>(); 27 if(nums == null || nums.length == 0) return res; 28 int len = nums.length; 29 Element[] sums = new Element[len+1]; 30 sums[0]= new Element(-1,0); 31 int sum =0; 32 for(int i=0;i<len;i++){ 33 sum += nums[i]; 34 sums[i+1]= new Element(i,sum); 35 } 36 Arrays.sort(sums); 37 for(int i=0;i<len;i++){ 38 if(sums[i].getValue()==sums[i+1].getValue()){ 39 int m = Math.min(sums[i].getIndex(),sums[i+1].getIndex())+1; 40 int n = Math.max(sums[i].getIndex(),sums[i+1].getIndex()); 41 res.add(m); 42 res.add(n); 43 return res; 44 } 45 } 46 return res; 47 } 48 }
时间: 2024-10-16 16:46:17