leetcode 560 和為k的子陣列

2021-10-20 19:37:24 字數 1082 閱讀 7865

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

示例 1 :

輸入:nums =[1

,1,1

], k =

2輸出:2,

[1,1

] 與 [1,

1] 為兩種不同的情況。

說明 :

陣列的長度為 [1,

20,000]。

陣列中元素的範圍是 [

-1000

,1000

] ,且整數 k 的範圍是 [

-1e7

,1e7

]。

思路:字首和+雜湊優化

1.字首和。

定義pre[i]為[0…i]裡所有數的和,則pre[i]可以由pre[i-1]遞推而來,即pre[i]=pre[i-1]+nums[i]

於是子串行[i…j]的和為k可以表示為pre[j]-pre[i-1]==k

當i=0時,此時i-1為-1,令pre[-1]=0,使得通項成立。

2.雜湊優化。

求出以i結尾的和為k的連續子陣列時只需要統計有多少個字首和為pre[i]-k的pre[j]即可。

由於不關心哪兩項字首和之差為k,只關心字首和之差為k出現的次數。

建立hash表mp,鍵為字首和,出現次數為對應的值。

遍歷nums之前,由於pre[-1]=0,於是將<0,1>也存入mp,表示已經出現過一次字首和為0。

遍歷nums,求每一項的字首和,統計對應出現的次數,如果之前存過,則+1,否則初始化為1。

邊存邊檢視mp,如果map中存在key為[當前字首和-k],說明這個之前出現的字首和,滿足[當前字首和-該字首和==k],將它出現的次數累加給count。

(當前字首和與歷史字首和之差而差分出的子陣列即為所求,如果該歷史字首和出現過c次,等價於當前項找到c個陣列求和等於k)。

ac**:(c++)

class

solution

return count;}}

;

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 ...