// 暴力 O(n^2) classSolution{ publicintsubarraySum(int[] nums, int k){ int len = nums.length; int count = 0; for(int left = 0; left < len; left++){ int sum = 0; for(int right = left; right < len; right++){ sum += nums[right]; if(sum == k) count++; } } return count; } }
// 前缀和 O(n^2) classSolution{ publicintsubarraySum(int[] nums, int k){ int len = nums.length; int count = 0; int[] preSum = newint[len + 1]; preSum[0] = 0; for(int i = 0; i < len; i++){ preSum[i + 1] = preSum[i] + nums[i]; }
for(int left = 0; left < len; left++){ for(int right = left; right < len; right++){ if(preSum[right + 1] - preSum[left] == k){ count++; } } } return count; } }
// 前缀和+哈希表 时复O(n) 空复O(n) classSolution{ publicintsubarraySum(int[] nums, int k){ int len = nums.length; int count = 0; Map<Integer, Integer> preSumMap = new HashMap<Integer, Integer>(); preSumMap.put(0, 1); int preSum = 0; for(int num:nums) { preSum += num; if(preSumMap.containsKey(preSum - k)) { count += preSumMap.get(preSum - k); } preSumMap.put(preSum, preSumMap.getOrDefault(preSum, 0) + 1); } return count; } }