LeetCode523,連續的子陣列和

2021-10-06 04:06:12 字數 1441 閱讀 6974

題目描述

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