lintcode 138. 子数组之和

问题描述

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

样例

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

问题分析:

这个问题比较好想的算法的时间复杂度是O(n^2),这不是我们希望看到的。

要解决这个问题我觉得需要明白两点:

1.一个子数组的和为零,我们假设这个子数组是{ a[i], a[i+1], ..., a[j] },也就是a[i] + a[i+1] +...+ a[j] = 0,起始和结束位置其实就是i和j。那么 a[0] + a[1] +...+ a[i-1] + a[i] + a[i+1] +...+ a[j]a[0] + a[1] +...+ a[i-1] 。把这个式子转换下,假如这个数组的前 i 项的和与前j项的和相等,那么i项到j项之间的数组的元素的和肯定是零。i,j就是需要的结果。

所以这个问题就转换成了求数组前n项和的问题

2.假如前 i 项的和为零,那么0 和 i 即为所求结果

我提供一种O(n)的解法,希望对大家有所启发

public List<Integer> subarraySum(int[] nums) {
        // write your code here
        ArrayList<Integer> list = new ArrayList<>();
		int[] sumArrays = new int[nums.length];
		sumArrays[0] = nums[0]; 
		for (int i = 1; i < nums.length; i++) {
			sumArrays[i] = sumArrays[i-1] + nums[i]; 
		}
		HashMap<Integer, Integer> indexsMap = new HashMap<>();
		for (int i = 0; i < sumArrays.length; i++) {
		    if (sumArrays[i] == 0) {
				list.add(0);
				list.add(i);
				return list;
			}
			if (indexsMap.containsKey(sumArrays[i])) {
				list.add(indexsMap.get(sumArrays[i])+1);
				list.add(i);
				return list;
			}
			indexsMap.put(sumArrays[i], i);
		}
		return list;
    }





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值