給定一個包含非負數的數組和一個目標整數 k,編寫一個函數來判斷該數組是否含有連續的子數組,其大小至少爲 2,總和爲 k 的倍數,即總和爲 n*k,其中 n 也是一個整數。
示例 1:
輸入: [23,2,4,6,7], k = 6
輸出: True
解釋: [2,4] 是一個大小爲 2 的子數組,並且和爲 6。
示例 2:
輸入: [23,2,6,4,7], k = 6
輸出: True
解釋: [23,2,6,4,7]是大小爲 5 的子數組,並且和爲 42。
說明:
數組的長度不會超過10,000。
你可以認爲所有數字總和在 32 位有符號整數範圍內。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/continuous-subarray-sum
題解
因爲要找的連續子數組爲k的倍數。假設表示的是前個元素的和,所以要計算區間的和爲。
所以如果和爲的倍數,所以即。所以我們只要確保有兩個前綴和對k取餘的值相等就可以判斷是否存在子數組。
func checkSubarraySum(nums []int, k int) bool {
mp := make(map[int]int , 0)
sum :=0
mp[0] = 0
for index,value := range nums {
sum += value
if k!=0 {
sum %= k
}
_, ok := mp[sum]
if ok {
//fmt.Println(mp[sum])
if (index+1- mp[sum] > 1) {
return true
}
} else {
mp[sum] = index+1
}
}
return false
}