当前位置: 首页 > 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  # 返回结果

相关文章:

  • C++11 智能指针:从原理到实现
  • 为什么badmin reconfig以后始终不能提交任务
  • C#语音录制:使用NAudio库实现语音录制功能详解
  • 【CBAP50技术手册】#32 Organizational Modelling(组织建模):BA(业务分析师)的“变革导航图”
  • Ubuntu取消开机用户自动登录
  • Practice 2025.6.1—— 二叉树进阶面试题(2)
  • Python爬虫:AutoScraper 库详细使用大全(一个智能、自动、轻量级的网络爬虫)
  • GNSS终端授时之四:高精度的PTP授时
  • JDBC连不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.
  • 通俗易懂的 JS DOM 操作指南:从创建到挂载
  • uniapp uni-id 如果是正式项目,需自行实现发送邮件的相关功能
  • 【Java基础】Java基础语法到高级特性
  • WEBSTORM前端 —— 第3章:移动 Web —— 第5节:响应式网页
  • Python 训练营打卡 Day 41
  • 船舶二阶非线性响应方程的EKF与UKF参数辨识
  • 使用BERT/BiLSTM + CRF 模型进行NER进展记录~
  • PyTorch ——torchvision数据集使用
  • 缓存击穿、缓存雪崩、缓存穿透以及数据库缓存双写不一致问题
  • 落石石头检测数据集VOC+YOLO格式1185张1类别
  • 【MySQL】第13节|MySQL 中模糊查询的全面总结
  • 做电商网站的框架结构图/武汉seo 网络推广
  • 网站素材图/网络口碑营销案例分析
  • 企业 宣传 还要网站吗/成人大专
  • 企业网站规划方案/进行网络推广
  • 服务区里可以做多少个网站/广东seo推广费用
  • ps做旅游网站/seo搜索排名