Algorithm - 560. Subarray Sum Equals K
Given an array of integers nums
and an integer k
, return the total number of subarrays whose sum equals to k
.
A subarray is a contiguous non-empty sequence of elements within an array.
Example 1:
Input: nums = [1,1,1], k = 2
Output: 2
Example 2:
Input: nums = [1,2,3], k = 3
Output: 2
Solution:
关键技术:
- 滑动窗口
- 注意array 的值既不是有序,也不是正数
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
pre_count = Counter({0:1})
result = 0
current_sum = 0
for num in nums:
current_sum += num
#前缀和 思想,得到Sj -- 找Si
result += pre_count[current_sum - k]
pre_count[current_sum]+=1
return result
好了我发现理解不了这个算法, 我去学习什么是前缀和了,勿扣,,,
更新,解决啦哈哈哈;
然后这里思考一个点 :
- 为什么更新result 和更新 pre_count 的顺序不能换?
扩展:
如果所有元素都是正数, 所有元素为正数的情况
# 定义一个变长窗口 – 是否可以使用 window_left , window_right 去定义
# 窗口内的所有数字和 = k – 满足 – 结果加 1
# 什么时候移动窗口呢? 1 一直右移 直到超过的时候,收尾巴,直到小于,然后重复这个过程
# 循环的停止条件是什么
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
# 定义一个变长窗口 -- 是否可以使用 window_left , window_right 去定义
# 窗口内的所有数字和 = k -- 满足 -- 结果加 1
# 什么时候移动窗口呢? 1 一直右移 直到超过的时候,收尾巴,直到小于,然后重复这个过程
# 循环的停止条件是什么
res = 0
window_sum = 0
window_left = 0
# 右指针负责遍历所有元素
for window_right in range(len(nums)):
window_sum += nums[window_right] # 加入右侧元素
# 缩小窗口直到窗口和小于等于 k
while window_sum > k and window_left <= window_right:
window_sum -= nums[window_left]
window_left += 1
# 若窗口和等于 k,则结果加 1
if window_sum == k:
res += 1
return res
被 【1】 , k = 0 ; 干死了,因为if > k 这里, 自己减自己了。因为判断条件里面有一个小于等于; 所以改进意见其实简单, 就是在最后等于的时候添加不等于 0 就行。