跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

前缀和专题:和为 k 的子数组与和可被 k 整除的子数组

前缀和结合哈希表解决子数组求和问题。对于和为 k 的子数组,遍历数组维护当前前缀和,查询哈希表中是否存在 sum-k 的前缀和并累加计数。对于和可被 k 整除的子数组,利用同余定理,若两前缀和对 k 取模结果相同则其差值可被 k 整除。需注意处理负数取模问题,统一使用 (sum % k + k) % k 保证余数为正。该方法将时间复杂度优化至 O(n)。

DevStack发布于 2026/2/14更新于 2026/7/2146 浏览
前缀和专题:和为 k 的子数组与和可被 k 整除的子数组

前缀和专题:和为 k 的子数组与和可被 k 整除的子数组

29. 和为 k 的子数组

题目链接:

560. 和为 K 的子数组 - 力扣(LeetCode)

题目描述:

文章配图

题目示例:

文章配图

算法原理(前缀和 + 哈希):

思路:

设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和

想知道有多少个**「以 i 为结尾的和为 k 的子数组」**,就要找到有多少个起始位置为 x1, x2, x3...使得 [x, i] 区间内的所有元素的和为 k。那么 [0, x] 区间内的和是不是就是 sum[i] - k 了。于是问题就变成:

  • 找到在 [0, i - 1] 区间内,有多少前缀和等于 sum[i] - k 的即可

我们不用真的初始化一个前缀和数组,因为我们只关心在 i 位置之前,有多少个前缀和等于 sum[i] - k。因此,我们仅需用一个哈希表,一边求当前位置的前缀和,一边存下之前每一种前缀和出现的次数

前缀和解法代码(C++):
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        hash[0]=1;
        int n=nums.size();
        int sum=0,ret=0;
        ( x:nums) {
            sum+=x;
            (hash.(sum-k)) ++ret;
            hash[sum]++;
        }
         ret;
    }
};
for
auto
if
count
return

30. 和可被 k 整除的子数组

题目链接:

974. 和可被 K 整除的子数组 - 力扣(LeetCode)

题目描述:

文章配图

题目示例:

文章配图

算法原理(前缀和 + 哈希):
前置知识补充:

同余定理:

如果 (a - b) % n == 0,那么我们可以得到一个结论:a % n == b % n。用文字叙述就是,如果两个数相减的差能被 n 整除,那么这两个数对 n 取模的结果相同。

例如:(26 - 2) % 12 == 0,那么 26 % 12 == 2 % 12 == 2。

负数取模问题:

  • c++ 中关于负数的取模运算,结果是**「把负数当成正数,取模之后的结果加上一个负号」。例如:-1 % 3 = -(1 % 3) = -1**
  • 因为有负数,为了防止发生「出现负数」的结果,以 (a % n + n) % n 的形式输出保证为正。例如:-1 % 3 = (-1 % 3 + 3) % 3 = 2

思路:

与上道题思路一样

设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和

  • 想知道有多少个「以 i 为结尾的可被 k 整除的子数组」,就要找到有多少个起始位置为 x1, x2, x3... 使得 [x, i] 区间内的所有元素的和可被 k 整除
  • 设【0,x-1】区间内所有元素之和等于 a ,【0,i】区间内所有元素的和等于 b,可得 (b - a) % k == 0
  • 由同余定理可得,【0,x-1】区间与【0,i】区间内的前缀和同余。于是问题就变成:找到在【0,i-1】区间内,有多少前缀和的余数等于 sum[i] % k 的即可

我们不用真的初始化一个前缀和数组,因为我们只关心在 i 位置之前,有多少个前缀和等于 sum[i] % k。但是这个我们需要处理一下,确保不会为负数。因此,我们仅需用一个哈希表,一边求当前位置的前缀和,一边存下之前每一种前缀和出现的次数

前缀和解法代码(C++):
class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        hash[0%k]=1;//0 这个数的余数
        int sum,ret=0;
        for(auto x:nums) {
            sum+=x;//算出当前位置的前缀和
            int r=(sum%k+k)%k;
            if(hash.count(r)) ret+=hash[r];
            hash[r]++;
        }
        return ret;
    }
};

**总结:**引入同余定理处理负数取模问题,同样采用哈希表优化查询效率,通过维护前缀和哈希表,将时间复杂度优化至 O(n),展示了前缀和技巧在子数组统计问题中的高效应用

目录

  1. 前缀和专题:和为 k 的子数组与和可被 k 整除的子数组
  2. 29. 和为 k 的子数组
  3. 算法原理(前缀和 + 哈希):
  4. 前缀和解法代码(C++):
  5. 30. 和可被 k 整除的子数组
  6. 算法原理(前缀和 + 哈希):
  7. 前置知识补充:
  8. 前缀和解法代码(C++):
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MySQL 联合查询实战:多表关联与子查询详解
  • Java 核心面试知识点梳理:基础、JVM、并发与框架实战
  • VSCode 使用 Git 快速提交代码指南
  • Windows下MySQL 8.4压缩包安装手记
  • 2022 信奥赛 C++ 提高组 CSP-S 复赛真题及题解:策略游戏
  • 前端加密实战:encrypt-labs 靶场环境与解密技巧
  • Python 字节码逆向工程:.pyc 文件还原解决方案
  • Spring Cloud 与 Dubbo 架构选型:生态全家桶 vs RPC 特种兵
  • OpenClaw 集成飞书搭建 AI 机器人指南
  • Eino 组件核心篇:Retriever 与 RAG 检索协议详解
  • 知网 AIGC 检测升级下的论文降重工具实测指南
  • RJ TextEd v16.54 免费多功能 Web 开发编辑器
  • Git 原理与使用深入剖析(上)
  • 大语言模型应用安全入门指南
  • Spring Cloud Gateway 统一服务入口实战指南
  • 初级程序员如何建立专业形象与高效沟通
  • 文心一言 4.5 开源模型深度解析:轻量化部署与中文场景优化
  • Flutter Web 开发解决跨域(CORS)问题指南
  • 量子仿真新进展:Walsh-Hadamard 变换硬件架构优化解析
  • faster-whisper 异步批处理架构解析:性能优化与高并发

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online