LeetCode525 連續陣列

2021-10-10 13:24:15 字數 994 閱讀 4947

題目說陣列長度最長可能到50000,所以如果暴力枚舉子陣列的起點、終點,再計算陣列和,複雜度就是o(n^3),肯定超時。

可以預處理出字首和,這樣只需要列舉起點和終點即可,但時間複雜度依然是o(n^2), 也不行。

這裡需要一點奇技淫巧,因為陣列只包含有0和1,如果一段子陣列含有相同數量的0和1,則這個子陣列中一半是0,一半是1,那麼子陣列的和就是這個子陣列的長度的一半。

更進一步,如果我們把陣列中所有的0都當作-1處理,那麼,當乙個子陣列中含有相同的0和1(也就是含有相同數量的-1和1)時,我們計算出來的子陣列的和就是0了。

所以,我們可以用乙個雜湊表訪問所有字首和的下標,這裡的字首和不是直接對原陣列計算字首和,而是把陣列中所有0按照-1處理、1仍然按1處理所得到的字首和。

雜湊表中記錄當前字首和的下標,因為題目要求最長的連續子陣列,所以我們只記錄當前字首和的最小的下標,如果之後碰到了乙個和當前字首和相同的字首和,則這兩個下標的差,就是乙個含有相同的0和1的子陣列的長度,可以用這個長度更新答案。

上面這幾句話有點抽象,實際上就是,假設我們當前得到了乙個字首和x,如果雜湊表中沒有記錄過這個字首和對應的下標,那麼我們在雜湊表中記錄字首和x對應的下標(假設為i);之後,如果我們又得到了乙個字首和presum[j]也是x,則presum[j] - presum[i - 1] = 0, 也就是說子陣列nums[i ~ j]中含有相同的0和1,因為把所有的0當作-1進行相加之後,得到的子陣列的和為0。

既然得到了滿足條件的乙個子陣列,我們可以用這個子陣列的長度更新答案:res = max(res, i - hash[curpresum]

這樣,通過用乙個雜湊表記錄字首和的下標(這裡的字首和計算把原陣列中所有的0按照-1處理),我們可以在**o(n)**的時間複雜度內計算出含有相同數量的0和1的最長連續子陣列的長度。

**如下:

class solution  else 

}return res;}};

leetcode 525 連續陣列

給定乙個二進位制陣列,找到含有相同數量的 0 和 1 的最長連續子陣列 的長度 示例 1 輸入 0,1 輸出 2說明 0,1 是具有相同數量0和1的最長連續子陣列。示例 2 輸入 0,1,0 輸出 2說明 0,1 或 1,0 是具有相同數量0和1的最長連續子陣列。注意 給定的二進位制陣列的長度不會超...

Leetcode 525 連續陣列 C

給定乙個二進位制陣列,找到含有相同數量的 0 和 1 的最長連續子陣列 的長度 示例 1 輸入 0,1 輸出 2 說明 0,1 是具有相同數量0和1的最長連續子陣列。示例 2 輸入 0,1,0 輸出 2 說明 0,1 或 1,0 是具有相同數量0和1的最長連續子陣列。注意 給定的二進位制陣列的長度不...

52 連續陣列

題目描述 給定乙個二進位制陣列,找到含有相同數量的 0 和 1 的最長連續子陣列 的長度 示例 1 輸入 0,1 輸出 2 說明 0,1 是具有相同數量0和1的最長連續子陣列。示例 2 輸入 0,1,0 輸出 2 說明 0,1 或 1,0 是具有相同數量0和1的最長連續子陣列。思路來自 連續陣列的解...