LeetCode之560 和為K的子陣列個數

2021-10-22 18:41:16 字數 1181 閱讀 1195

560. 和為k的子陣列

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

示例 1 :

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

陣列的長度為 [1, 20,000]。

陣列中元素的範圍是 [-1000, 1000] ,且整數k的範圍是 [-1e7, 1e7]。

讀題分析:

輸入為乙個整數陣列(元素非正整數,所以可負、可0,可正),乙個整數k。

要求找到該陣列中和為k的連續的子陣列的個數。

也就是說需要找到陣列中連續的陣列片段,滿足這個片段的和為k,結果是返回共有多少個這樣的陣列片段。

思想1:暴力解法

採用兩層迴圈的方式,外層迴圈逆序移動right,使用right為子陣列右邊界;記憶體迴圈移動left,使用left為子陣列左邊界。在right確定的情況下,left從right位置開始逆序遍歷到0。看每次相加sums[left]時,值是否為k,如果是則累加全域性計數。

for(right = sumsize - 1; right >= 0; right--) 

}totalsum = 0;

}

其中right作為每次連續子陣列的右邊界,所以需要必須包含right位置的數值,所以逆序遍歷。

這是最直接的計算思想,也是暴力計算,這裡使用了兩層迴圈,時間複雜度為o(n2),即n的平方,當資料規模大時,肯定會超時。

思想2:字首和

連續子陣列的和,很容易想到字首和方法(任何兩個位置[left, right]區間的和,等於從0到right區間的和,減去從0到(left - 1)區間的和)。

所以是否存在到left到right的連續子陣列和為k,則可認為是否在right前存在字首和為right的字首和與k的差值,如果存在,則找到乙個區間。如果該差值有多個,則對應多個區間。

所以需要乙個根據差值查詢是否存在,以及存在幾個的方法。這種通過key查詢的方式可以使用hash表的方式。這樣可以提高查詢速度。

所以此題最終可以使用字首和+雜湊的方式來解答。

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