当前位置: 首页 > news >正文

LeetCode 热题 100——子串——和为 K 的子数组

10.和为 K 的子数组

题目描述

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

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2
示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107

求解

(1)暴力求解
遍历所有可能。一开始,还想着排序,不过排序就乱了。。。

var subarraySum = function(nums, k) {if (nums.length === 0) return 0let ans = 0;for (let i = 0; i < nums.length; i++) {// 单个数字if (nums[i] === k) ans++let item = nums[i]for (let j = i + 1; j < nums.length; j++) {item += nums[j]if (item === k) {ans ++}}}return ans
};

(2)优化:前缀和 + 哈希表

  • 什么是前缀和?
    定义一个前缀和数组 prefixSum,其中 prefixSum[i] 表示数组 nums 中前 i 个元素的和(即 nums[0] 到 nums[i-1] 的和)

    prefixSum[0] = 0 (0 个元素的和,也就是没有元素的和)
    prefixSum[1] = nums[0]
    prefixSum[2] = nums[0] + nums[1]
    prefixSum[3] = nums[0] + nums[1] + nums[2]
    ...
    prefixSum[n] = nums[0] + nums[1] + ... + nums[n-1]
    

    那么,数组中从索引 j 到 i-1 的子数组(即 nums[j], nums[j+1], ..., nums[i-1])的和就可以表示为:sum(nums[j..i-1]) = prefixSum[i] - prefixSum[j]

  • 问题转化
    我们的目标是找到所有满足 sum(nums[j..i-1]) = k 的子数组。根据上面的公式,这等价于找到所有满足 prefixSum[i] - prefixSum[j] = k 的 (i, j) 对。
    我们可以将其变形为:prefixSum[j] = prefixSum[i] - k
    思路就变成了:当我们遍历到第 i 个元素,计算出 prefixSum[i] 时,我们想知道在 i 之前,有多少个 j 满足 prefixSum[j] 的值等于 prefixSum[i] - k。每找到一个这样的 j,就意味着存在一个以当前 i-1 为结尾的子数组,其和为 k

  • 哈希表的作用
    为了高效地回答 “之前有多少个 prefixSum[j] 等于某个值” 这个问题,我们可以使用一个哈希表(在 JavaScript 中是 Map 或普通对象)。

    • 键 (Key):我们遍历过程中遇到的 prefixSum 值。
    • 值 (Value):该 prefixSum 值出现的次数。

具体代码:

var subarraySum = function(nums, k) {if (nums.length === 0) return 0let ans = 0let preSum = 0let map = new Map() // 存放 前缀和 出现的次数map.set(0, 1) // 空集for (let num of nums) {preSum += num // 求前缀和// 判断 是否有 符合条件的,有则将前缀和加起来if (map.has(preSum - k)) ans += map.get(preSum - k)// 将当前前缀和加入map.set(preSum, (map.get(preSum) || 0) + 1)}return ans
};
http://www.dtcms.com/a/617931.html

相关文章:

  • JVM内存结构深度解析:堆、栈、方法区、元空间、直接内存
  • H-RDT:基于人类操作增强的双臂机器人操作研究
  • hysAnalyser --- UDP实时流分析使用指南
  • 象棋棋理基础
  • 要怎么推广网站全国工程招标信息网
  • 做教育网站多少钱如何选择企业建站公司
  • 高斯db的客户端连接工具
  • 网站建设与维护成本网站负责人核验照
  • 软件架构师技术一览与具体工作思考
  • [Java 算法] 双指针 2
  • Python语言设计模式:外观模式详解
  • 企业网站seo推广设计网站公司 露 联湖南岚鸿
  • 外贸建设网站公司微能力者恶魔网站谁做的
  • Python软件设计模式解析与实战
  • 工业互联网:连接未来制造的数字大脑
  • 基于单片机的水泵效率温差法测量与报警系统设计
  • 推荐工程笔记:设计模式/java与性能优化
  • 【安全函数】C语言安全字符串函数详解:告别缓冲区溢出的噩梦
  • 免费收录软文网站网站制作公司在哪里找
  • 3.FPGA位宽
  • Linux操作系统基础命令基础
  • 永恒之蓝内网横向渗透:原理详解+telnet法渗透实践(CVE-2017-0144)
  • 购物网站答辩ppt怎么做做购物平台网站 民治
  • 【Linux】Linux编译器-gcc/g++使用和gcc具体编译过程以及编译选项的小插曲
  • flume单机版安装
  • C++篇(17)哈希拓展学习
  • 做建筑材料的网站wordpress后台左侧菜单显示
  • 基于SpringBoot的热门旅游推荐系统设计与实现
  • leetcode 1513 仅含1的子串数
  • 2014网站怎么备案网站怎么做口碑