Skip to content

Latest commit

 

History

History

0560.Subarray-Sum-Equals-K

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

题目

Given an array of integers nums and an integer k, return the total number of continuous subarrays whose sum equals to k.

Example 1:

Input: nums = [1,1,1], k = 2
Output: 2

Example 2:

Input: nums = [1,2,3], k = 3
Output: 2

Constraints:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -10^7 <= k <= 10^7

题目大意

给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k ****的连续子数组的个数。

解题思路

  • 此题不能使用滑动窗口来解。因为 nums[i] 可能为负数。
  • 前缀和的思路可以解答此题,但是时间复杂度有点高了,O(n^2)。考虑优化时间复杂度。
  • 题目要求找到连续区间和为 k 的子区间总数,即区间 [i,j] 内的和为 K ⇒ prefixSum[j] - prefixSum[i-1] == k。所以 prefixSum[j] == k - prefixSum[i-1] 。这样转换以后,题目就转换成类似 A + B = K 的问题了。LeetCode 第一题的优化思路拿来用。用 map 存储累加过的结果。如此优化以后,时间复杂度 O(n)

代码

package leetcode

func subarraySum(nums []int, k int) int {
	count, pre := 0, 0
	m := map[int]int{}
	m[0] = 1
	for i := 0; i < len(nums); i++ {
		pre += nums[i]
		if _, ok := m[pre-k]; ok {
			count += m[pre-k]
		}
		m[pre] += 1
	}
	return count
}