LeetCode-560和为K的子数组

本文最后更新于:2025年1月19日 上午

LeetCode-560和为 K 的子数组

题目描述

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

题解

滑动窗口(错解)

未考虑负数的情况

nums = [-1,-1,1] , k = 0出错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution(object):
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
ans = 0
length = len(nums)
i, j = 0, 0
sub_sum = nums[0]

while i < length and j < length and i <= j:
if sub_sum < k:
j += 1
if j < length:
sub_sum += nums[j]
elif sub_sum == k:
ans += 1
sub_sum -= nums[i]
i += 1
j += 1
if j < length:
sub_sum += nums[j]
else:
if i < j:
sub_sum -= nums[i]
i += 1
elif i == j and j < length-1:
sub_sum -= nums[i]
i += 1
j += 1
sub_sum += nums[j]
else:
break

return ans

前缀和+哈希

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution(object):
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
mp = {}
ans, pre = 0, 0
for num in nums:
pre += num
if pre == k:
ans += 1
if pre - k in mp:
ans += mp[pre-k]

# 前缀和哈希表
if pre in mp:
mp[pre] += 1
else:
mp[pre] = 1

return ans


LeetCode-560和为K的子数组
https://furthur509.github.io/2025/01/19/LeetCode-560和为 K 的子数组/
作者
Yang Mingxin
发布于
2025年1月19日
许可协议