題目描述
給定乙個包含非負數的陣列和乙個目標整數 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。
暴力,特別注意0!!!!!!!!!求乙個陣列中連續的子串行的和是否能被k整除。最壞的情況就是遍歷所有的子串行。n-1+n-2+n-3+…+1=(n-1)n/2,時間複雜度:o(n^2)
按照上面的思路,計算出每個子串行的和,進行判斷。
如果使用二維陣列,使用二維陣列時,會有一大半的空間都是空閒的(n[^2]-n(n-1)/2),會報超出記憶體限制。可以優化為一維陣列。
使用二維陣列,會報記憶體超出:
public
boolean
solution
(int
n,int k)
else
if(dp[i]
[j]%k ==0)
return
true;}
return
false
;}
優化後,轉為一維陣列:
public
boolean
solution2
(int
n,int k)
dp[i]
= n[i]
;for
(int j = i +
1; j < n.length; j++
)else
if(dp[j]
% k ==0)
return
true;}
}return
false
;}
缺點
優化為一維陣列之後,過是過了,但是結果顯示,時間空間都佔的太多了。看了官方題解,這是人能想到的思路嗎?!!!
官方思路
使用hashmap,用空間換時間記錄子串行(從下標為0開始的子串行)的餘數。sum(n) mod k
如果出現兩個子串行的餘數相同(map.contains(key)),則第後面的餘數可以消除,將第一次出現的位置的子串行剔除,剩餘的子串行為滿足條件的子串行。
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 輸...
LeetCode 523 連續的子陣列和
給定乙個包含非負數的陣列和乙個目標整數 k,編寫乙個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,總和為 k 的倍數,即總和為 n k,其中 n 也是乙個整數。示例 1 輸入 23,2,4,6,7 k 6 輸出 true 解釋 2,4 是乙個大小為 2 的子陣列,並且和為 6。示例 2 輸...