###### tags: `Leetcode` `medium` `hash` `prefix sum` `python`
# 523. Continuous Subarray Sum
## [題目連結:] https://leetcode.com/problems/continuous-subarray-sum/
## 題目:
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 = 6
Output: true
Explanation: [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 = 6
Output: true
Explanation: [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 = 13
Output: false
```
## 解題想法:
* 連續子序列(長度>=2)總和能整除k
* 利用同餘概念
* a%c=x
* b%c=x
* (a-b)%c=**0**
* 用一個dic紀錄每次出現的餘數:
* **key:當前餘數**
* **val:當前餘數出現的位置**
* 若當前餘數已經出現在dic中且距離>1 return True
## Python:
``` python=
class Solution(object):
def checkSubarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
curMod=0
dic={0:-1} #key:mod,val:pos
for pos,val in enumerate(nums):
#每次累加,取餘數
curMod+=val
curMod%=k
if curMod in dic:
#需大於1,ex: nums=[0],k=1這種極端case應為False
if pos-dic[curMod]>1:
return True
else:
dic[curMod]=pos
return False
if __name__ == '__main__':
result=Solution()
ans=result.checkSubarraySum(nums = [23,2,4,6,7], k = 6)
print(ans)
```