和為k的子陣列

2022-10-06 13:45:12 字數 1175 閱讀 7660

給你乙個整數陣列nums和乙個整數k,請你統計並返回該陣列中和為k的連續子陣列的個數

示例 1:

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

輸出:2

示例 2:

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

輸出:2

一般看到陣列中的連續子陣列求和,我們會想到使用字首和

解法:字首和

**:

public static int subarraysum(int nums, int k) 

int count = 0;

for(int left = 0;left < prenums.length;left++)}}

return count;

}public static int subarraysum1(int nums,int k)

map.put(pre,map.getordefault(pre, 0)+1);

}return count;

}

**解析:

前面乙個方法是單純的字首和方法,時間複雜度為o(n),我們定義了乙個字首和陣列,其中的每乙個陣列元素都對應了原來陣列的前n項和,接下來我們遍歷字首和陣列。我們先固定陣列的左邊界,讓左邊不動,然後陣列的右邊節不斷向右擴張,擴張乙個,就將當前的值和k進行對比,如果相同,則count+1,不相同則右邊界擴張。如果右邊界到達了陣列的末尾,將左邊界右移一位,右邊界回到左邊界的起始位置,重新開始,知道左邊界遍歷到陣列的末尾,最後得到的count就是和為k的子陣列個數

第二個方法是對字首和方法的優化,使用雜湊表來幫助我們簡化了求子陣列和的過程。我們在遍歷陣列的時候,每一次都記錄陣列的字首和,雜湊表中以字首和為key,字首和出現的次數作為value存放資料。因為pre[j]-pre[i] = k,所以pre[i] = pre[j]-k,所以我們可以用當前字首和-k的值代表此時有乙個子陣列的和為k,因此我們只需要判斷雜湊表中有沒有pre[j]-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 ...

560 和為K的子陣列

題解 1.維護乙個unordered map 字首陣列和,count 2.遍歷陣列的累加和,如果存在sum k,在 unordered map裡面,則有count種情況 複雜度分析 解題思路 一 建立map表用於儲存每個連續子陣列sum求和出現的次數,初始化為 0,1 表示和為0的連續子陣列出現1次...

和為K的連續子陣列

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