美文网首页
560. Subarray Sum Equals K

560. Subarray Sum Equals K

作者: jluemmmm | 来源:发表于2021-02-07 16:45 被阅读0次

给定数组,求和为k的连续子数组的数目

暴力解法

  • 时间复杂度 O(n^2),空间复杂度O(1)
  • Runtime: 992 ms, faster than 5.09%
  • Memory Usage: 41.4 MB, less than 95.61%
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function(nums, k) {
    let count = 0
    let len = nums.length
    for(let i = 0; i < len; i++) {
      let sum = 0
      for(let j = i; j < len; j++) {
        sum += nums[j]
        if(sum === k) count++
      }
    }
  return count
};

前缀和 + 哈希表优化

pre[i] 为 0~i 里面的所有元素和
k = pre[i] - pre[j - 1] 为 i~j 的所有元素的和
对抵消元素进行一次处理

  • 时间复杂度O(n),空间复杂度O(n)
  • Runtime: 104 ms, faster than 84.15%
  • Memory Usage: 47.5 MB, less than 58.33%

一次循环遍历的时候,将值写入 Set 中。Set 提供了新的数据结构 set,类似于数组,成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。Map 类似对象,对象也可以当作键,只有对同一个对象的引用,Map 结构才将其视为同一个键。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function(nums, k) {
    let map = new Map()
    let count = 0
    let pre = 0
    map.set(0, 1) // 抵消元素
    for(let item of nums) {
      pre += item
      if(map.has(pre - k)) {
        count += map.get(pre - k)
      }
      if(map.has(pre)) {
        map.set(pre, map.get(pre) + 1)
      } else {
        map.set(pre, 1)
      }
    }
  return count
};

相关文章

网友评论

      本文标题:560. Subarray Sum Equals K

      本文链接:https://www.haomeiwen.com/subject/pjsztltx.html