LeetCode 560 和爲 k 的子數組

LeetCode 560 和爲 k 的子數組

560. 和爲K的子數組

難度中等307

給定一個整數數組和一個整數 **k,**你需要找到該數組中和爲 k 的連續的子數組的個數。

示例 1 :

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

說明 :

  1. 數組的長度爲 [1, 20,000]。
  2. 數組中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。

思路

使用累加和解決。
對於 索引 i 和 j 之間的累積和,  如果累計總和,在索引 i 和 j 處相差 k,即 sum[i] - sum[j] = k,
sum[i]−sum[j]=k,則位於索引 i 和 j 之間的元素之和是 k。

因此, 只要在遍歷的過程中 sum-k 存在於哈希表中就說明 ,比如 sum - k = sum_x, 就說明 sum_x 到 sum 之間的元素 累積和爲 k ,
比如 [3,4,7,2,-3,1,4,2]  後面的 1+4+2 = 7
   那麼 到1索引時, 13  + 1 + 4 + 2 = 20 
   也就是說 只要後的累積和 sum_i 減去 k 能夠在哈希表中找到對應的key (sum_j),那麼就說明 j 到 i 之間的累積和 爲 k。

代碼

public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0, sum = 0;
        HashMap < Integer, Integer > map = new HashMap < > ();
        map.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (map.containsKey(sum - k))
                count += map.get(sum - k);
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return count;
    }
}

// 作者:LeetCode
// 鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/he-wei-kde-zi-shu-zu-by-leetcode/
// 來源:力扣(LeetCode)
// 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章