您的位置:首页 > 其它

子数组之和

2015-11-30 22:32 190 查看
给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置

样例

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

class Element implements Comparable<Element>{
int index;
int value;
public Element (int i,int v){
index = i;
value = v;
}
public int compareTo(Element other){
return this.value-other.value;
}
public int getIndex(){
return index;
}
public int getValue(){
return value;
}
}
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) {
// write your code here
ArrayList<Integer> res = new ArrayList<Integer>();
if(nums == null || nums.length == 0)   return res;
int len = nums.length;
Element[] sums = new Element[len+1];
sums[0]= new Element(-1,0);
int sum =0;
for(int i=0;i<len;i++){
sum += nums[i];
sums[i+1]= new Element(i,sum);
}
Arrays.sort(sums);
for(int i=0;i<len;i++){
if(sums[i].getValue()==sums[i+1].getValue()){
int m = Math.min(sums[i].getIndex(),sums[i+1].getIndex())+1;
int n = Math.max(sums[i].getIndex(),sums[i+1].getIndex());
res.add(m);
res.add(n);
return res;
}
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: