有趣的dp
我们要求的是num[L] + num[L+1] + … + num[R] mod k 是否等于零。
所以我求一个前缀和A[L] + A[L+1] + … + A[R] = P[R+1] - P[L]
则我们要求 P[R+1] - P[L] mod k = 0
那么我们现在对每一个P[i] mod k,则只需要判断p[R+1] - P[L]是否为零,也就是是否存在两个相同的P[i]且距离相差2以上。
同时根据鸽巢原理,当n>=2*k时,必然存在3个P[i]相同,也就是必然是可行的。
# -*- coding: utf-8 -*-
# @Author: HaonanWu
# @Date: 2017-03-06 20:56:21
# @Last Modified by: HaonanWu
# @Last Modified time: 2017-03-06 20:56:21
class Solution(object):
def checkSubarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
if k == 0:
# if two continuous zeros in nums, return True
# time O(n)
for i in range(0, len(nums) - 1):
if nums[i] == 0 and nums[i+1] == 0:
return True
return False
k = abs(k)
if len(nums) >= k * 2:
return True
P = [0]
for x in nums:
v = P[-1] + x
v %= k
P.append(v)
seen = set()
for i in xrange(len(P) - 3, -1, -1):
seen.add(P[i+2])
if P[i] in seen:
return True
return False