LeetCode 523 連續的子陣列和

2021-09-26 08:54:04 字數 1006 閱讀 8353

給定乙個包含非負數的陣列和乙個目標整數 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] % ki-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。示...