leetcode 560 和為k的子陣列

2021-10-19 10:54:24 字數 659 閱讀 1660

字首和

有乙個很有意思的技巧,叫做字首和,問題很簡單,有乙個陣列,我現在想知道其每個子區間的和。

暴力做法自然是列舉所有的子陣列,複雜度是n^3。但是觀察到這個計算過程中有一些重複計算,能不能簡化呢?

新建乙個陣列,記錄原陣列中前i個元素的和,這樣i到j區間的和就可以用新建的陣列中j的值減去i的值表示了,總複雜度達到了n^2,這種優化方法就叫字首和。

雜湊表

針對本題,還可以利用字首和的特性進行進一步優化。注意到我們的條件是sum[j]-sum[i]=k,我們在計算sum的時候又是按照下標從小到大計算的,那麼我們在計算到sum[j]的時候,實際上只要找找前面有沒有已經算好的滿足我們條件的sum[i]就可以了,這個「找」,就可以用雜湊表來實現優化。這樣實際上在一遍計算字首和的過程中就完成了本題,複雜度達到了n。

**:

class

solution

hashmap.

put(sum[i]

, hashmap.

getordefault

(sum[i],0

)+1)

;}return res;

}}

26ms 41.3mb

leetcode 560 和為k的子陣列

給定乙個整數陣列和乙個整數k,你需要找到該陣列中和為k的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。說明 陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數k的範圍是 1e7,1e7 解法1 暴力法 p...

LeetCode 560 和為K的子陣列

給定乙個整數陣列和乙個整數k,你需要找到該陣列中和為k的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。說明 陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數k的範圍是 1e7,1e7 解題思路 從前向後...

Leetcode 560 和為K的子陣列

560.和為k的子陣列 一開始用的窮舉,超時了 class solution def subarraysum self,nums list int k int int counter 0for i in range len nums sum 0 a i while a len nums 1 sum ...