2020/05/15 每日一题
对于要求连续子数组的题目,灵活使用前缀和和滑窗的方法。特点在于,前缀和是否递增。
560.和为k的子数组
题目需要注意几个关键点,数组元素是既有正数又有负数的,且要求是连续的子数组。
数组元素既有正数又有负数隐含了意思,数组不是单调的。因此不适合用滑动窗口的方法。**滑窗特点是,固定了左边界以后,右边界找到了一个可行解以后,右边界再靠右边的更大的区间肯定不存在目标值,所以才将左边界继续向右滑。**在这道题里显然没有这个性质。
其次,这里的连续子数组的限制给了我们采用前缀和的空间。我们保存前缀和进行比较即可。
要求presum[i]-k = presum[j]
也就是存在[j+1,i]
这个子区间的和为k。
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
## 看到数组中有连续子数组,因此考虑前缀和的思路
dic = collections.defaultdict(int)
dic