首页 > 编程语言 > 详细

子数组之和

时间:2015-11-30 23:56:49      阅读:413      评论:0      收藏:0      [点我收藏+]

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

样例

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

 

 

 

子数组之和

原文:http://www.cnblogs.com/wangnanabuaa/p/5008648.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!