一、前缀和算法简介
前缀和就是一个数组前N个数只和,利用前N个数和数组作为辅助数据解题。
二、例题
此类题目比较简单,一般如果不要求记录具体位置坐标还可以构造字典,降低时间复杂度,不过构造时要注意边界条件,如一开始要把0加进字典里面。
1、leetcode 560
【解题思路】
求前缀和的字典,因为不需要知道具体位置,然后对数组求和,每到一个位置前N个之和sum与目标值k对比,相减就是需要的数据,再去字段中寻找改数字的数量。
【解题代码】
class Solution(object):
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
sum = 0
sum_dict = {0:1}
res_num = 0
for i in range(len(nums)):
sum += nums[i]
target_value = sum - k
if target_value in sum_dict:
res_num += sum_dict[target_value]
if sum in sum_dict:
sum_dict[sum] += 1
else:
sum_dict[sum] = 1
return res_num
2、leetcode 1248
【解题思路】
与上题目解法类似,只是将和变为奇数的数量。
【解题代码】
class Solution(object):
def numberOfSubarrays(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
odd_sum = 0
odd_dict = {0:1}
res_num = 0
for i in range(len(nums)):
if nums[i] % 2 == 1:
odd_sum += 1
target_value = odd_sum - k
if target_value in odd_dict:
res_num += odd_dict[target_value]
if odd_sum in odd_dict:
odd_dict[odd_sum] += 1
else:
odd_dict[odd_sum] = 1
return res_num