Leetcode——523. 連續的子數組和

給定一個包含非負數的數組和一個目標整數 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的倍數。假設sum[i]sum[i]表示的是前ii個元素的和,所以要計算區間[i,j][i,j]的和爲sum[j]sum[i]sum[j]-sum[i]
所以如果和爲kk的倍數,所以(sum[i]sum[j])%k=0(sum[i]-sum[j])\%k =0sum[i]%k==sum[j]%ksum[i]\%k == sum[j]\%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 

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章