leetcode連續陣列系列

2021-10-06 19:17:45 字數 1828 閱讀 3217

560:和為k的子陣列

給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子數》

組的個數。

示例 1 :

輸入:nums = [1,1,1], k = 2 輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。

這道題暴力的解法就是先儲存陣列的字首和,然後遍歷差分,求所有和為k的子陣列,時間複雜度為o(n^2)。

一次遍歷的解法:遍歷求字首和,利用hashmap將所有字首和的次數儲存起來,遍歷到某個字首和sum時,判斷map中是否存在sum-k,如果有,說明有連續陣列的和為k。最後將此字首和次數+1存入map中。此解法時間複雜度為o(n)。注意當字首和sum==k時,sum-k=0,所以需要初始化map.put(0,1)。

class

solution

return res;

}}

525. 連續陣列

給定乙個二進位制陣列, 找到含有相同數量的 0 和 1 的最長連續子陣列(的長度)。

示例 1:

輸入: [0,1,1]

輸出: 2

說明: [0, 1] 是具有相同數量0和1的最長連續子陣列。

這道題和上面那道題異曲同工,不過需要轉換一下思路,同樣用字首和sum(i),不過遇到0加1,遇到1減1,若區間[i,j]的0,1數量相同,那麼sum(i-1)sum(j)字首和相同,那麼長度就為j-(i-1),因此我們需要map來儲存的是字首和所在的索引,此外,因為題目求得是最長連續子陣列,所以我們不能更新字首和所在的索引,只保留第一次的索引。注意這道題map初始化應該為map.put(0,-1)

public

intfindmaxlength

(int

nums)

else

}return res;

}

1004. 最大連續1的個數 iii

給定乙個由若干 0 和 1 組成的陣列 a,我們最多可以將 k 個值從 0 變成 1 。返回僅包含 1 的最長(連續)子陣列的長度。

示例 1:

輸入:a = [1,1,1,0,0,0,1,1,1,1,0], k = 2

輸出:6

解釋:[1,1,1,0,0,1,1,1,1,1,1]

粗體數字從 0 翻轉到 1,最長的子陣列長度為 6。

這道題最直觀的解法就是依次嘗試將k個0轉換為1的後的子串長度,先固定子串左邊位置left,然後滑動右視窗,遇到0則k--直到k為-1。但是這樣的解法存在大量的重複計算,能否優化去掉一部分重複計算呢?

考慮到k為-1時,視窗內的0的數量為k,假設此時右指標位置為right,左指標為left,當left的下一位仍為1時,視窗內的0的數量沒有變,所以連續長度肯定-1,所以不需要這部分的計算,因此下一次搜尋時需要移動左指標來去掉乙個0,這樣就會減少不需要的重複計算。

public

intlongestones

(int

a,int k)

right++;}

return math.

max(right-left,res)

;}

LeetCode 查詢陣列系列

33.search in rotated sorted array 題目 在乙個被旋轉一次的遞增陣列中找到目標值。思路 二分法 思路一定要清晰!當mid和目標值不等時,判斷mid和start的大小,大於說明旋轉位置在後面,反之在前面。在後面的時候start mid是遞增的,可以直接判斷目標值在不在其...

LeetCode 陣列系列(間隔)

56.merge intervals 題目 interval包含start和end,將重疊部分合併 思路 用start和end標記目前的最後乙個,但不急著加到list裡面,因為可能有變化,對list操作時間複雜度高。還需要注意對interval型別進行compare函式重寫,或是使用匿名比較器。de...

Leetcode 陣列之和系列

leetcode 1.兩數之和 方法1 排序 查詢 方法2 雜湊法 class solution def twosum self,nums list int target int list int sum 0 m for i in range len nums sum nums i if targe...