1. 程式人生 > 其它 >和為 K 的子陣列

和為 K 的子陣列

技術標籤:Leetcode-【陣列篇】

題目描述

1

我想到的是暴力破解,見程式碼,外層遍歷陣列,內層以該元素為結尾,累加之前的,和為k,結果加1。這樣不會重也不會漏

程式碼:

public int subarraySum(int[] nums, int k) {
        int res = 0;
        for(int i = 0; i < nums.length; i++){
            int j = i;
            int sum = 0;
            for(; j >= 0; j--){
                sum += nums[j];
                if(sum == k){
                    res++;
                }
            }
        }
        return res;
    }

時間複雜度O(n2),空間複雜度O(1)

解法二:

本題採用雜湊表儲存從陣列第一個元素不斷往後的子序列和,然後判斷到當前元素的序列總和減去K的值在雜湊表中有多少個,即為包含當前元素的子序列可以得到目標結果,利用前後子序列的差可以得到目標子序列和為K

程式碼:

public int subarraySum(int[] nums, int k) {     
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        int sum = 0, result = 0;

        for(int i = 0; i < nums.length; ++i) {
            sum += nums[i];
            if(map.containsKey(sum-k))
                result += map.get(sum-k);
            map.put(sum, map.getOrDefault(sum, 0)+1);
        }
        
        return result;
    }

Map.getOrDefault(Object key, V defaultValue)方法的作用是:
  當Map集合中有這個key時,就使用這個key值;
  如果沒有就使用預設值defaultValue