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

前缀和算法:和为 k 的子数组与和可被 k 整除的子数组

前缀和算法解决子数组统计问题。对于和为 K 的子数组,通过哈希表记录前缀和频次实现 O(n) 查找。对于和可被 K 整除的子数组,利用同余定理处理负数取模,维护前缀和余数哈希表,将时间复杂度优化至线性级别。

清心发布于 2026/3/27更新于 2026/6/1532 浏览
前缀和算法:和为 k 的子数组与和可被 k 整除的子数组

29. 和为 k 的子数组

题目链接:

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

题目描述:

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

题目示例:

输入:nums = [1,1,1], k = 2 输出:2 解释:[1,1] 与 [1,1] 是两种不同的情况

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

思路:

设 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;
        for(auto x:nums) {
            sum+=x;
            if(hash.count(sum-k)) ++ret;
            hash[sum]++;
        }
        return ret;
    }
};

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

题目链接:

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

题目描述:

给定一个整数数组 A,返回其中元素之和可被 K 整除的非空连续子数组的数目。

题目示例:

输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释:有 7 个子数组满足条件。

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

同余定理:

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

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

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

更多推荐文章

查看全部
  • 大模型产品经理转行指南:核心素质与学习路径
  • 什么是生成式人工智能?
  • 2024 大模型行业应用案例集及学习路线图解析
  • 大语言模型(LLM)微调方法总结
  • 大语言模型微调技术详解:从原理到实践
  • 2024 年大模型技术演进与行业应用深度解析
  • YOLOv8 算法详解:架构、核心创新与部署实践
  • 医疗大模型:数据与知识双轮驱动的医学推理与临床决策支持
  • 2024 年程序员入门大模型必读书单推荐
  • 2024 年 AI 绘画现状分析:Midjourney 与 Stable Diffusion 实用价值探讨
  • 数据结构:B-树
  • 2024 国内最新完整 AI 大模型清单及介绍
  • Python 数据分析库 Pandas 核心操作详解
  • Ubuntu 20.04 安装 Ollama 与 Open WebUI 部署大模型指南
  • 实战篇:Python 开发 MongoDB 数据库 MCP Server
  • 2024 大模型典型示范应用案例集
  • 2024 AI 进阶指南:AIGC、AGI 与 ChatGPT 精选书籍推荐
  • 2024 AI 大模型面试核心知识点与实战技巧
  • LightRAG 详解:基于图结构的检索增强生成系统实践
  • 网络安全学习路线与职业指南

相关免费在线工具

  • 加密/解密文本

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