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

子串题解——和为 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.lryc.cn/news/2395374.html

相关文章:

  • 深入理解设计模式之访问者模式
  • Java代码重构:如何提升项目的可维护性和扩展性?
  • 《Python语言程序设计》2018 第4章第9题3重量和价钱的对比,利用第7章的概念来解答你
  • Nginx安装操作命令
  • 在IIS上无法使用PUT等请求
  • Codeforces Round 1028 (Div. 2) B. Gellyfish and Baby‘s Breath
  • 数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(上)
  • 前端八股HTTP和https大全套
  • 使用 DeepSeek API 搭建智能体《无间》- 卓伊凡的完整指南 -优雅草卓伊凡
  • 量子语言模型——where to go
  • flutter使用html_editor_enhanced: ^2.6.0后,编辑框无法获取焦点,无法操作
  • FPGA纯verilog实现MIPI-DSI视频编码输出,提供工程源码和技术支持
  • 手写字魔法消除3:深度学习PmrNet神经网络实现图片修复(含训练代码、数据集和GUI交互界面)
  • 大数据运维过程中常见的一些操作
  • opencv使用经典bug
  • 劫持进程注入
  • 计算机基础——宏病毒防御与网络技术
  • 深度解析互联网区(Internet ):架构、风险与防护全攻略
  • 2024Flutter面试题
  • C++内存学习
  • Python uv包管理工具使用详解
  • [Linux] Linux 系统从启动到驱动加载
  • 基于微信小程序的云校园信息服务平台设计与实现(源码+定制+开发)云端校园服务系统开发 面向师生的校园事务小程序设计与实现 融合微信生态的智慧校园管理系统开发
  • 大语言模型的技术原理与应用前景:从Transformer到ChatGPT
  • 如何编写GitLab-CI配置文件
  • 生成式人工智能:重构软件开发的范式革命与未来生态
  • 关于 java:4. 异常处理与调试
  • Java基础 Day26
  • android lifeCycleOwner生命周期
  • 高防IP能抗住500G攻击吗?