Skip to content

Latest commit

 

History

History
58 lines (40 loc) · 1.46 KB

File metadata and controls

58 lines (40 loc) · 1.46 KB

题目

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 funcsubarraySum(nums []int, kint) int { count, pre:=0, 0m:=map[int]int{} m[0] =1fori:=0; i<len(nums); i++ { pre+=nums[i] if_, ok:=m[pre-k]; ok { count+=m[pre-k] } m[pre] +=1 } returncount }
close