跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书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/10/21106 浏览
前缀和专题:和为 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++):

更多推荐文章

查看全部
  • OpenClaw 结合 Qwen3.5 实现本地 AI 助手部署
  • 基于 Vue3 的大文件分片加密上传与断点续传实战
  • 基于 AI 分类器与飞书机器人的智能工单系统搭建
  • Ubuntu 下 AMD AI MAX 395 使用 ROCm 部署 Qwen 模型
  • 四款主流 AI 编程 IDE 横向评测:从辅助到代理的演进路径
  • 大模型时代的人才需求与核心岗位分析
  • 2026 年高校 AIGC 检测政策汇总与应对指南
  • 基于 Zynq FPGA 的雷龙 SD NAND 测试
  • OpenClaw 多 Agent 模式:构建专属 AI 助手团队
  • 基于 NVIDIA DGX Spark 部署 Stable Diffusion 3.5 及 ComfyUI
  • 基于 WebGIS 的中国传统六大区域与身份证首位数字关联展示
  • Codex Multi-Agent 与 Claude Agent Teams 技术对比与选型指南
  • 链表带环检测与入口定位:快慢指针法原理及实现
  • 注意力机制与 Transformer 模型实战
  • Linux 进程间通信进阶:管道与共享内存
  • 根据设计图生成前端代码,零基础入门到精通,收藏这篇就够了
  • SKResNet 架构详解:融合选择性卷积与残差结构
  • Python 爬虫实战:从基础抓取到多线程下载优化
  • 鸿蒙 5.0 运动健康应用开发:多传感器融合与 AI 教练实战
  • VSCode 自定义 Copilot Agent 与 Awesome Agent 模板

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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