lintcode--子数组之和

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

 注意事项

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

样例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值