0560. Subarray Sum Equals K

560. Subarray Sum Equals K #

题目 #

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
}

⬅️上一页

下一页➡️

Calendar Apr 8, 2023
Edit Edit this page
本站总访问量:  次 您是本站第  位访问者