leetcode-560:和為k的連續子陣列
分析題目可以知道所求是在給定陣列範圍內求解區間(i,j)的子陣列之和sum使得sum = k
- 通過兩層迴圈依次求出所有累加和與k值比較
c++**實現如下
class
solution
}return res;}}
;
時間複雜度:o(n^2)
空間複雜度:o(1)
由於時間複雜度為n^2故執行時間並不理想,但依然可以通過測試資料,因為係數k較低,如果是建立陣列儲存所有sum和再進行加減操作就是注釋裡得部分就無法通過了
思考優化
本質上是求(i,j) 的累加和與k比較判斷是否相等
有什麼辦法可以通過一次迴圈得到所求呢
建立累加和陣列sums,其中sums[i]表示[0,i]區間內的累加和
tips這裡的區間表示我覺得非常重要,因為開閉區間包含與不包含對資料的處理和思路的分析有很大的影響,
個人感覺演算法很多時候細節非常重要
[i, j)區域內的累加和我們就可以用sums[j] - sums[i]得到
也就是說如果sums[j] - sums[i] = k 就是我們選擇的乙個方案
之前的方法是求出所有的累加和,但這其實進行了很多不必要的操作,我們從另外乙個思路出發
每次進行迴圈的時候我們得到了乙個[0,j]的累加和sum.我們記錄這個sum
如果sum - k 的值存在我們的記錄中,就意味著我們得到了乙個解決方案
因此我們用hash表記錄在迴圈過程中所有求得的sum
還記得之前我們所用到得是閉區間吧那如果是[0,i]為所求得子陣列呢.
初始化得時候讓表內多乙個值為0個數為1 的初始鍵值就可以解決這個問題
c++**如下
class
solution
return res;}}
;
時空複雜度均為o(n)
字首和 和為k的連續子陣列
給定乙個整數陣列和乙個整數k,你需要找到該陣列中和為k的連續的子陣列的個數。示例輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。此題暴力法則為求出每一段連續的子陣列的和,然後遍歷這些和求出和為k的陣列個數 一段連續的數必然有乙個左邊界和乙個右邊界,所以只要列舉所有...
和為k的子陣列
給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。說明 陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數 k 的範圍是 1e7,1e7 o n ...
和為k的子陣列
給你乙個整數陣列nums和乙個整數k,請你統計並返回該陣列中和為k的連續子陣列的個數 示例 1 輸入 nums 1,1,1 k 2 輸出 2示例 2 輸入 nums 1,2,3 k 3 輸出 2 一般看到陣列中的連續子陣列求和,我們會想到使用字首和 解法 字首和 public static int ...