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

子串题解——和为 K 的子数组【LeetCode】

谨记: 数组不是单调的话,不要用滑动窗口,考虑用前缀和

写法一:两次遍历

代码的核心思想是通过 前缀和 和 哈希表 来高效地统计符合条件的子数组个数。具体步骤如下:

  1. 计算前缀和数组 s

    • s[i] 表示 nums 的前 i 个元素的和。
    • s[0] = 0,表示前 0 个元素的和为 0。
    • 例如,nums = [1, 1, 1],则 s = [0, 1, 2, 3]
  2. 使用 defaultdict 记录前缀和出现的次数

    • defaultdict(int) 是一个字典,默认值为 0。如果访问一个不存在的键,会返回 0,而不是抛出异常。
    • cnt[sj] 表示前缀和 sj 出现的次数。
  3. 遍历前缀和数组 s,统计符合条件的子数组个数

    • 对于每个前缀和 sj,检查是否存在前缀和 sj - k
      • 如果存在,则说明从某个位置到当前位置的子数组和为 k
      • 将 cnt[sj - k] 的值加到 ans 中。
    • 将当前前缀和 sj 记录到 cnt 中。
from collections import defaultdictclass Solution(object):def subarraySum(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""# 1. 计算前缀和数组 ss = [0] * (len(nums) + 1)  # s[0] = 0,表示前 0 个元素的和为 0for i, x in enumerate(nums):s[i + 1] = s[i] + x  # s[i+1] = s[i] + nums[i]# 2. 初始化结果和哈希表ans = 0  # 记录符合条件的子数组个数cnt = defaultdict(int)  # 哈希表,记录前缀和出现的次数# 3. 遍历前缀和数组,统计符合条件的子数组个数for sj in s:# 如果存在 s[i] = sj - k,则说明从 i+1 到 j 的子数组和为 kans += cnt[sj - k]# 将当前前缀和 sj 记录到哈希表中cnt[sj] += 1return ans  # 返回结果

写法二:一次遍历

  • 前缀和:使用变量 s 动态计算当前的前缀和。
  • 哈希表:使用哈希表 cnt 记录前缀和出现的次数。
  • 核心思想:对于当前前缀和 s,检查是否存在前缀和 s - k。如果存在,则说明从某个位置到当前位置的子数组和为 k

核心逻辑

  1. 更新前缀和
    • s += x:将当前元素 x 加到前缀和 s 中。
  2. 检查是否存在 s - k
    • 如果 cnt[s - k] 存在,则说明从某个位置到当前位置的子数组和为 k
    • 将 cnt[s - k] 的值加到 ans 中。
  3. 记录当前前缀和
    • cnt[s] += 1:将当前前缀和 s 记录到哈希表中。
from collections import defaultdictclass Solution(object):def subarraySum(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""ans = s = 0  # ans 记录结果,s 记录当前前缀和cnt = defaultdict(int)  # 哈希表,记录前缀和出现的次数cnt[0] = 1  # 初始化,s[0]=0 出现了一次# 遍历数组,动态计算前缀和for x in nums:s += x  # 更新当前前缀和# 如果存在 s - k,则说明从某个位置到当前位置的子数组和为 kans += cnt[s - k]# 将当前前缀和 s 记录到哈希表中cnt[s] += 1return ans  # 返回结果
http://www.xdnf.cn/news/753247.html

相关文章:

  • 进阶日记(一)—LLMs本地部署与运行(更新中)
  • 【机器学习基础】机器学习入门核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation)
  • NLP学习路线图(十六):N-gram模型
  • C# 序列化技术全面解析:原理、实现与应用场景
  • 基于大模型预测的寻常型天疱疮诊疗方案研究报告
  • ERP系统中商品定价功能设计:支持渠道、会员与批发场景的灵活定价机制
  • 行业分析---小米汽车2025第一季度财报
  • 基于Python学习《Head First设计模式》第二章 观察者模式
  • 基于 Flickr30k-Entities 数据集 的 Phrase Localization
  • 动态规划第二弹:路径类问题(不同路径,珠宝的最高价值,地下城游戏)
  • rtpmixsound:实现音频混音攻击!全参数详细教程!Kali Linux教程!
  • 五、单元测试-概述入门
  • SQL进阶之旅 Day 10:执行计划解读与优化
  • FFmpeg学习笔记
  • SDL_CreateRendererWithProperties报错Parameter ‘window‘ is invalid
  • Maven概述,搭建,使用
  • leetcode-hot-100 (矩阵)
  • 设计模式——组合设计模式(结构型)
  • Android第十一次面试补充篇
  • 读《Go语言圣经记录》(二):深入理解Go语言的程序结构
  • NodeJS全栈开发面试题讲解——P10微服务架构(Node.js + 多服务协作)
  • VMware Tools 手动编译安装版
  • qwen-0.5b小模型的用处和显存要求
  • Unity Mono与IL2CPP比较
  • 大模型备案中语料安全详细说明
  • 开源库免费API服务平台 ALLBEAPI
  • unix/linux source 命令,其内部结构机制
  • unix/linux source 命令,其高级使用
  • 通义开源视觉感知多模态 RAG 推理框架 VRAG-RL:开启多模态推理新时代
  • 【前端】html2pdf实现用前端下载pdf