和為 K 的子陣列
阿新 • • 發佈:2021-02-18
技術標籤:Leetcode-【陣列篇】
題目描述
我想到的是暴力破解,見程式碼,外層遍歷陣列,內層以該元素為結尾,累加之前的,和為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