添加链接描述
class Solution:def subarraySum(self, nums: List[int], k: int) -> int:# 思路是从第一个元素开始遍历,加到爆,就把指针向前移一位result=0for i in range(len(nums)):# 如果爆了,就向后移一位if i!=len(nums)-1:j=i+1sum=nums[i]while sum<k and j<len(nums):sum=sum+nums[j]j=j+1if sum==k:result+=1 return result
考虑错误,没有如果都是正数,可以,但是有负数的话,整个逻辑就错掉了。
class Solution:def subarraySum(self, nums: List[int], k: int) -> int:count, total, sum_dict = 0, 0, {0: 1} # 初始化计数器、总和和字典for num in nums:total += num # 计算当前位置的总和if total - k in sum_dict:count += sum_dict[total - k] # 如果前缀和 - k 在字典中出现过,更新计数器sum_dict[total] = sum_dict.get(total, 0) + 1 # 更新当前前缀和出现次数return count
思路:
- 这个题要找到就是指针为i的地方的sum[i]-sum[j]是否等于k
- 现在我们知道sum[i]的值(就是从0下标加到i下标),也知道k的值,唯一不知道的就是sum[j](从头加到下标j的值)是否存在
- 所以用一个字典记录sum[j]的值出现的次数
- 妙啊妙啊