560:和為k的子陣列
給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子數》這道題暴力的解法就是先儲存陣列的字首和,然後遍歷差分,求所有和為k的子陣列,時間複雜度為o(n^2)。組的個數。
示例 1 :
輸入:nums = [1,1,1], k = 2 輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。
一次遍歷的解法:遍歷求字首和,利用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 的最長(連續)子陣列的長度。這道題最直觀的解法就是依次嘗試將k個0轉換為1的後的子串長度,先固定子串左邊位置left,然後滑動右視窗,遇到0則示例 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--
直到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...