您的位置:首页 > 其它

lintcode--子数组之和

2017-07-16 10:01 169 查看
给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置


 注意事项


There is at least one subarray that it's sum equals to zero.

您在真实的面试中是否遇到过这个题? 

Yes

样例

给出 
[-3, 1, 2, -3, 4]
,返回
[0,
2]
 或者 
[1, 3]
.

/*

子树的和是0,根据给的例子:[-3, 1, 2, -3, 4],

其累加和【-3,-2,0,-3,1】中心出现了一个数0 ,

同时发现两个-3,第一个-3开始到第二个-3之前的部分就是这个子数组

数组【1,2,3,-5,3】,其累加和【1,3,6,1,5】,

两个1之间的部分就是答案,根据元素数组:不包括第一个1的位置,包括第二个1的位置

所以:计算累加和,当和的值之前已经出现了,这个区间内的数就是子数组的起始id

注意:

当包括0位置的时候,包括0位置,不包括最后一个位置

当不包括0位置的时候,包括上一个数位置,不包括当前位置

这个时候需要加入一个值防止是第一个数,

put(0,-1),表示还没有数的时候数是0,

起始位置是-1,这样当包括0位置的情况,转化为不包括0的情况

思路:

    1.先累加得到新数组,存入map

    2.比较新数组中相同的两个数,相同则为之间的数

*/

public class Solution {

    public ArrayList<Intege
96f5
r> subarraySum(int[] nums) {

        // write your code here

        int numslen = nums.length;

        ArrayList<Integer> result = new ArrayList<Integer>();

        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();

        map.put(0,-1);//起始位置为-1

        int sum = 0;

        for(int i=0;i<numslen;i++){

            sum+=nums[i];//累加

            if(map.containsKey(sum)){

                result.add(map.get(sum) + 1);//前

                result.add(i);//后

                return result;

            }

            //没有相同就存入

            map.put(sum,i);

        }

        return result;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: