Subarray Sum Equals K

本文介绍了一种高效查找数组中所有连续子数组并统计其和等于指定值K的方法。通过使用HashMap记录子数组元素和及其出现次数,实现了O(n)的时间复杂度。

Subarray Sum Equals K

Given an array of integers and an integer k, you need to find the total number of >continuous subarrays whose sum equals to k.

Example 1:

Input:nums = [1,1,1], k = 2
Output: 2

Note:

  1. The length of the array is in range [1, 20,000].
  2. The range of numbers in the array is [-1000, 1000] and the range of the integer k is >[-1e7, 1e7].

分析

这道题开始并不容易想,因为不是典型的那种可以用DP解决的子数组类型的题。由于求的是子subarray和为K的总个数,只能想办法找出所有和为K的子数组,然后返回个数就可以。

那么关键点就是怎么找出所有和为K的子数组,bruce force的方法显然不可行。突破点就是我们可以把任意子数组的里面所有元素的和转化为两个子数组累计元素和之差,当然这个两个子数组指的是头元素是大数组第一个元素的连续子数组。这样一来,我们用一个HashMap来记录每个子数组元素和对应的次数就可以了。

我们从头开始读数组,记录下累计元素之和,把每次的和存在HashMap中,通过HashMap在每次读的过程中我们可以找出是否前面存在一个数组与当前数组之差等于K,这样我们就可以找出所以子数组之和为K的情况。由于存在前面子数组和相同的情况,我们用HashMap记录每个和对应的次数就可以了。

复杂度

time: O(n), space: O(n)

代码

class Solution {
    public int subarraySum(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        int sum = 0;
        int count = 0;
        for (int num : nums) {
            sum += num;
            if (map.containsKey(sum - k)) {
                count += map.get(sum - k);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return count;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值