這里是
我的解決方案:
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
int sum = 0;
int mod = 0;
boolean isPresent = false;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i =0; i<nums.length; i ) {
sum = sum nums[i];
mod = sum%k;
if((mod==0 && i!=0) || (map.containsKey(mod) && (i - map.get(mod))>1)) {
isPresent = true;
break;
}
map.put(mod, i);
}
return isPresent;
}
}
uj5u.com熱心網友回復:
解決方案
你有一個巧妙的解決方案。只需稍加修改即可解決問題。但是,首先不應該反對這樣一個事實,[0, 0]即任何給定的k. 實際上,您的解決方案也可以涵蓋此類情況,只需進行一項修改:
if(map.get(mod) == null) map.put(mod, i);
推理
如果地圖中存在模組,我們不應對其進行不必要的更新。在nums = [5, 0, 0, 0]和 等情況下可能會導致錯誤k = 3。方法如下:
對于每次迭代,這些變數是:
at i= 0 --> 最后將 (5, 0) 放入映射中。
at i= 1 --> 最后把 (5, 1) 放到地圖上。
at i= 2 --> 最后把 (5, 2) 放到地圖上。
at i= 3 --> 最后把 (5, 3) 放到地圖上。
在每一步中,您都會更新 (mod, i) 對。結果,(i - map.get(mod))>1)總是給出false。i如果mod已經存在于地圖中,則不更新相應的值應該可以解決問題。
有人可能會爭論為什么不去掉(i - map.get(mod))>1)部分?
嗯,因為它用于以下情況:
nums = [1,0]和key = 2。
額外的
您的代碼需要33 ms運行時和大約128 MB記憶體。只需稍加修改,您就可以讓它變得更好。
剛剛擺脫了的isPresent變數和回傳true的if條件。false外回傳for loop。有了這些,在 Leetcode 上就可以17 ms完成并54 MB大致完成。確切的數字可能因計算機而異。
uj5u.com熱心網友回復:
查看子陣列 [0,0,0],總和為 0,0 可被任何整數整除。
您實作的問題是,它的子陣列只能從第一個元素開始。當您在當前回圈周圍添加第二個 for 回圈以更改開始元素時,您將找到解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/327567.html
上一篇:具有唯一編號的陣列數量
下一篇:實作圖操作演算法
