LeetCode 560 – 和为 K 的子数组

题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2
示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

1 <= nums.length <= 2 * 10^4
-1000 <= nums[i] <= 1000
-10^7 <= k <= 10^7

题目分析

数组中的数字存在负数,因此不能使用滑动窗口来解决。
前缀和 + 哈希表。
假设 pre[i] 表示从 0 到 i 的元素的和,那么 从 l 到 r 的和就等于 pre[r] – pre[l-1]。从左到右枚举数组,同时把前缀和添加到哈希表中(可能存在重复值,因此key是前缀和,value是数量)。
对于每个 r,都存在两种情况满足子数组和为k:
– l = 0,且 pre[r] = k
– l > 0,哈希表中存在 pre[r] – k

Java

public int subarraySum(int[] nums, int k) {
    int pre = 0;
    int ans = 0;
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int num : nums) {
        pre += num;
        if (pre == k) {
            ans++;
        }
        ans += map.getOrDefault(pre - k, 0);

        map.put(pre, map.getOrDefault(pre, 0) + 1);
    }
    return ans;
}

Kotlin

fun subarraySum(nums: IntArray, k: Int): Int {
    var ans = 0
    var pre = 0
    val map = HashMap<Int, Int>()
    for (r in nums.indices) {
        pre += nums[r]
        if (pre == k) {
            ans++
        }
        ans += map[pre - k] ?: 0

        map[pre] = (map[pre] ?: 0) + 1
    }
    return ans
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部