動機
要與560一起看
Problem
Given an integer array nums
and an integer k
, return true
if nums
has a continuous subarray of size at least two whose elements sum up to a multiple of k
, or false
otherwise.
An integer x
is a multiple of k
if there exists an integer n
such that x = n * k
. 0
is always a multiple of k
.
Example 1:
Input: nums = [23,2,4,6,7], k = 6Output: trueExplanation: [2, 4] is a continuous subarray of size 2 whose elements sum up to 6.
Example 2:
Input: nums = [23,2,6,4,7], k = 6Output: trueExplanation: [23, 2, 6, 4, 7] is an continuous subarray of size 5 whose elements sum up to 42.42 is a multiple of 6 because 42 = 7 * 6 and 7 is an integer.
Example 3:
Input: nums = [23,2,6,4,7], k = 13Output: false
Constraints:
1 <= nums.length <= 105
0 <= nums[i] <= 109
0 <= sum(nums[i]) <= 231 - 1
1 <= k <= 231 - 1
Sol: 看是不是倍數
存連續和,之後就是一次一次試看有沒有k的倍數
class Solution:
def checkSubarraySum(self, nums: List[int], k: int) -> bool:
ret = False
sums = []
cnt = 0
nums = [0] + nums #[0,0],0
# sum(nums[j:i]) = sums[:i] - sum[:j] -
for i in range(len(nums)):
cnt += nums[i]
if cnt == k and i > 1:
return True
for j in range(len(sums)):
#print(i,j)
if k == 0:
if (cnt - sums[j]) == 0:
#print((i-j) > 1)
ret = ret or (i-j) > 1
elif (cnt - sums[j]) % k == 0:
#print((i-j) > 1)
ret = ret or (i-j) > 1 #not only this sol [23, 2, "6", 4, 7], k=6
sums.append(cnt)
if ret :
return True
return False
Sol2: 取餘數
sum[j] - sum[i] = a[j] + ... + a[i+1]
如果是k的倍數都取餘會變成
sum[j]%k - sum[i]%k = 0
class Solution:
def checkSubarraySum(self, nums: List[int], k: int) -> bool:
check = {}
check[0] = -1
pre_sum = 0
for i,num in enumerate(nums):
pre_sum += num
if k != 0:
pre_sum %= k
if pre_sum in check:
if i - check[pre_sum] > 1:
return True
else:
check[pre_sum] = i
return False