字首和 和為k的連續子陣列

2021-10-22 22:13:40 字數 1080 閱讀 8479

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

示例

輸入:nums = [1,1,1], k = 2

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

此題暴力法則為求出每一段連續的子陣列的和,然後遍歷這些和求出和為k的陣列個數

一段連續的數必然有乙個左邊界和乙個右邊界,所以只要列舉所有的左右邊界即可得出所有的連續子陣列

class

solution

if(sum == k) ans++;}

}return ans;

}}

時間複雜度:o(n3n^

n3)空間複雜度:o(1)

事實上列舉邊界的時候就已經順帶求出了子陣列和,沒必要再單獨求和

比如左邊界固定時,右邊界列舉 [i, nums.length) 時當j = i + 1時就求出了[i, i + 1]這個子陣列的和

class

solution

// 此時的sum表示[i, j]的和

if(sum == k) ans++;}

}return ans;

}}

時間複雜度:o(n2n^

n2)空間複雜度:o(1)

事實上,看到這題的第一瞬間就應該想到用字首和寫,兩個典型特點

要知道求一段連續的數的和除了用累加,還可以用[0, i - 1]的和減[0, j]的和,就等於[i, j]的和,[0, x]的和就是x的字首和

我們可以求出陣列每個元素的字首和,設m為[0, i]的和,n為[0, j]的和,n - m = k轉換一下為m + k = n;那麼問題就轉化為找到乙個元素的字首和與k的和等於n,這不就是力扣第一題經典題兩數之和嗎

class

solution

return ans;

}}

時間複雜度:o(nnn)

空間複雜度:o(nnn)

字首和還有個二叉樹版本,思想類似

二叉樹版字首和

和為K的連續子陣列

leetcode 560 和為k的連續子陣列 分析題目可以知道所求是在給定陣列範圍內求解區間 i,j 的子陣列之和sum使得sum k 通過兩層迴圈依次求出所有累加和與k值比較 c 實現如下 class solution return res 時間複雜度 o n 2 空間複雜度 o 1 由於時間複雜...

一維字首和 連續陣列和為k

給定乙個整數陣列和乙個整數 k 請找到該陣列中和為 k 的連續子陣列的個數。滑動視窗沒辦法解決有負數的情況 預處理 字首和 sum ij presum j presum i 1 class solution int ans 0 for int i 1 i n i return ans 使用hashm...

和為K的子陣列 字首和 雜湊表

給定乙個整數陣列和乙個整數k,你需要找到該陣列中和為k的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。public int subarraysum int nums,int k mp.put pre,mp.getordefault ...