1、題目數組
一、審題 spa
二、分析code
給定一個整形數組。若存在連續的序列相加和爲 k ,統計這樣的序列的個數。blog
2、解答get
方法1、class
時間複雜度: O(N^2),空間複雜度:O(1)循環
① 將所給數組 nums,連續元素相加。 nums[i] 表明下標 i 及i以前的元素之和。遍歷
② 採用 count 記錄知足的序列個數。方法
③ 採用循環遍歷數組 nums,若 nums[i] == K。 則 count++。 採用內循環,若 nums[j] - nums[i] == k ,則 count++im
④ 返回 count
public int subarraySum(int[] nums, int k) { int count = 0; for (int i = 1; i < nums.length; i++) nums[i] += nums[i - 1]; for (int i = 0; i < nums.length; i++) { if(nums[i] == k) count++; for (int j = i + 1; j < nums.length; j++) { if(nums[j] - nums[i] == k) count++; } } return count; }
方法2、
採用一個 Map 存儲。 key=sum, value=count;
時間複雜度:O(N); 空間複雜度:O(N)
public int subarraySum2(int[] nums, int k) { int sum = 0, result = 0; HashMap<Integer, Integer> preSum = new HashMap<>(); preSum.put(0, 1); for (int i = 0; i < nums.length; i++) { sum += nums[i]; result += preSum.getOrDefault(sum - k, 0); preSum.put(sum, preSum.getOrDefault(sum, 0) + 1); } return result; }