跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

前缀和技术实战:从乘积到整除子数组

前缀和不仅用于求和,还能解决乘积与整除类问题。通过拆分前后缀乘积或同余定理转换,可将 O(n^2) 复杂度优化至 O(n)。Java 实现中需注意负数取模差异,统一处理为数学正余数。掌握哈希表记录前缀和模值,即可高效统计满足条件的子数组数量。

暗影行者发布于 2026/3/16更新于 2026/5/85 浏览
前缀和技术实战:从乘积到整除子数组

前缀和技术实战:从乘积到整除子数组

文章配图

文章配图

一、问题直化前缀和

1. 拆拼

核心思路是将问题拆解为可累积的前缀与后缀部分进行拼合。

文章配图

public int[] productExceptSelf(int[] nums) {
    int n = nums.length;
    int[] f = new int[n], g = new int[n], ret = new int[n];
    f[0] = g[n - 1] = 1;
    for (int i = 1; i < n; i++) f[i] = f[i - 1] * nums[i - 1];
    for (int i = n - 2; i >= 0; i--) g[i] = g[i + 1] * nums[i + 1];
    for (   ; i < n; i++) ret[i] = f[i] * g[i];
     ret;
}
int
i
=
0
return

二、问题转用前缀和

1. 模减消实质

利用同余性质简化计算:(a + p*k) % p = a % p。

2. 同余定理

若差被整除 (a - b) % p == 0,则 a % p == b % p。

2.1 证明
(a - b) / p = k
=> a - b = p * k
=> a = b + p * k
=> a % p = (b + p * k) % p
=> a % p = b % p

3. 取模%

3.1 计算机行为

文章配图

3.1.1 向零取整 相除

余数绝对值最接近 0 地相除。

3.1.2 符号

同被除数。

3.2 数学定义

文章配图

3.2.1 向下取整 相除

余数正值最接近 0 地相除。

3.2.2 符号

正数。

3.3 两者关系
3.3.1 差异

只有 负 % 正 的负数取模时 结果会不同(计算机为负、数学为正)。

3.3.2 转化

计算机 相同等效、不同转化 为 数学 的模结果:(a % p + p) % p。

文章配图

public int subarraysDivByK(int[] nums, int k) {
    Map<Integer, Integer> map = new HashMap<>();
    int sum = 0, ret = 0;
    // 初始化 map 包含 {0:1},处理前缀和本身能被 k 整除的情况
    map.put(0, 1);
    for (int i = 0; i < nums.length; i++) {
        sum += nums[i];
        // 统一处理负数取模,确保结果为正,符合数学定义
        int r = (sum % k + k) % k;
        // 若当前前缀和模 k 的值之前出现过,说明中间这段子数组和能被 k 整除
        ret += map.getOrDefault(r, 0);
        // 更新该模值的出现次数
        map.put(r, map.getOrDefault(r, 0) + 1);
    }
    return ret;
}

目录

  1. 前缀和技术实战:从乘积到整除子数组
  2. 一、问题直化前缀和
  3. 1. 拆拼
  4. 二、问题转用前缀和
  5. 1. 模减消实质
  6. 2. 同余定理
  7. 2.1 证明
  8. 3. 取模%
  9. 3.1 计算机行为
  10. 3.1.1 向零取整 相除
  11. 3.1.2 符号
  12. 3.2 数学定义
  13. 3.2.1 向下取整 相除
  14. 3.2.2 符号
  15. 3.3 两者关系
  16. 3.3.1 差异
  17. 3.3.2 转化
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Windows 11 本地部署 OpenClaw 实操:集成 Telegram 机器人与网页搜索能力
  • SpringBoot 源码解析:AnnotationConfigServletWebServerApplicationContext 构造方法
  • 大模型微调的 7 种主流方法详解
  • MATLAB 实现基于 RRT-DNN 的无人机三维路径规划
  • Soft Actor-Critic (SAC) 算法详解与 PyTorch 实现
  • Python HTTP 请求库对比:requests、aiohttp 与 httpx
  • 深度优先搜索 (DFS) 原理与实现详解
  • Llama-Factory 用于养生食谱推荐与健康管理 APP 集成
  • GPU 算力云服务的技术探索与 AIGC 应用支持
  • CMake 项目中 Vcpkg、Conan 与 Spack 的 C++ 依赖管理对比
  • 开源软件管理实战指南:从问题诊断到高效运维
  • Flutter for OpenHarmony 集成 dart_openai 实现 AIGC 功能实战
  • AI 需求预测的局限与 Python 开发者的心理洞察实践
  • CARLA 仿真:自定义地图与 AI 车辆行为编程
  • 常见 Web 安全技术总结与入门指南
  • OpenClaw 快速部署指南:免环境配置十分钟跑通 AI 助理
  • IntelliJ IDEA 中配置使用 Claude Code 方法
  • 2025 年第十六届蓝桥杯省赛 JavaB 组真题详解
  • Git 核心原理与团队协作实战指南
  • C 语言快速排序详解:从基础到非递归实现

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

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

  • Gemini 图片去水印

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