給定乙個包含非負數的陣列和乙個目標整數 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 位有符號整數範圍內。
使用雜湊map來儲存累積和除以k後的餘數。
為什麼存餘數?
遍歷陣列,將當前的累積和儲存到map中,如果存在i-j
範圍內的連續子陣列和是k的倍數,那麼當前餘數sum[j] % k
和i-1
時刻的餘數sum[i-1] % k
是一致的。sum[j] = sum[i-1] + n*k
,所以map裡存餘數,如果發現重複餘數,則存在連續子陣列和是k的倍數。
注意題目中要求子陣列長度大於1,map中key是餘數,value就儲存索引資訊,遇到重複餘數時,檢查一下索引差值是否大於1(對應子陣列長度大於1),大於則返回true。
注意一種特殊情況:陣列總和剛好能整除k,在索引n-1時在map中首次新增key值:0,當前演算法對於這種情況是返回false的,為解決這種衝突,在map中首先新增key值『0』,索引值置為-1,這樣在最後整除時再次新增key值0,發現有重複,判斷一下索引差值即可正確判斷返回值。具體**如下:
class solution
else
mp[rem] = i;
}return false;
}};
LeetCode523 連續子陣列和
1 未考慮的情況 k 0的情況,一般涉及到 和 都要優先考慮到除數為0的情況。k 0且陣列中有連續兩個0的情況,返回true 雙層迴圈,複雜度 o n 2 package com.leetcode.dp public class leet523 system.out.println checksub...
Leetcode 523 連續的子陣列和
給定乙個包含非負數的陣列和乙個目標整數 k,編寫乙個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,總和為 k 的倍數,即總和為 n k,其中 n 也是乙個整數。示例 1 輸入 23,2,4,6,7 k 6 輸出 true 解釋 2,4 是乙個大小為 2 的子陣列,並且和為 6。示例 2 輸...
LeetCode523,連續的子陣列和
題目描述 給定乙個包含非負數的陣列和乙個目標整數 k,編寫乙個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,總和為 k 的倍數,即總和為 n k,其中 n 也是乙個整數。示例 1 輸入 23,2,4,6,7 k 6 輸出 true 解釋 2,4 是乙個大小為 2 的子陣列,並且和為 6。示...