LeetCode560 和為K的子陣列
阿新 • • 發佈:2021-07-07
題目
給定一個整數陣列和一個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。
示例 1 :
輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。
說明 :
陣列的長度為 [1, 20,000]。
陣列中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。
方法
列舉法
遍歷陣列,並計算從i開始的子陣列是否滿足條件
- 時間複雜度:O(n2),n為nums陣列的長度
- 空間複雜度:O(1)
class Solution { public int subarraySum(int[] nums, int k) { int n = nums.length; int result = 0; for(int i=0;i<n;i++){ int sum = 0; for(int j=i;j<n;j++){ sum += nums[j]; if(sum==k){ result++; } } } return result; } }
動態規劃法
遍歷陣列,用pre記錄當前位的相加之和,求某區間[i,j]的和即pre[j]-pre[i-1],
- 時間複雜度:O(n)
- 空間複雜度:O(n)
public class Solution { public int subarraySum(int[] nums, int k) { int result = 0,sum = 0; Map<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)){ result += map.get(sum-k); } map.put(sum,map.getOrDefault(sum,0)+1); } return result; } }