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

算法实战:利用前缀和解中心下标与数组乘积问题

寻找数组中心下标需判断左右元素和是否相等,除自身以外数组乘积要求不使用除法且时间复杂度为 O(N)。核心思路均基于前缀和(或前缀积)思想,通过预处理数组记录左侧累积值,结合右侧信息快速计算目标结果。示例代码使用 C++ 实现,展示了如何构建辅助数组来替代暴力枚举,有效降低时间复杂度并提升执行效率。

星星泡饭发布于 2026/3/22更新于 2026/8/2244 浏览
算法实战:利用前缀和解中心下标与数组乘积问题

算法实战:前缀和技巧解中心下标与数组乘积问题

27. 寻找数组的中心下标

题目描述

给定一个整数数组 nums,请编写一个算法返回该数组的「中心下标」。

数组的「中心下标」是指数组中满足以下条件的索引:

  • 该索引左侧所有元素之和等于右侧所有元素之和。
  • 如果不存在这样的索引,返回 -1。

解题思路

这道题的核心在于找到数组中一个索引,使得该索引左侧所有元素之和等于右侧所有元素之和。

直观的想法是遍历每个位置,分别计算左右两边的和,但这样会导致 O(N²) 的时间复杂度。为了优化到 O(N),我们可以利用前缀和的思想。

核心逻辑:

  1. 预处理出两个数组:
    • f[i]:表示索引 i 左侧所有元素的和(前缀和)。
    • g[i]:表示索引 i 右侧所有元素的和(后缀和)。
  2. 遍历数组,判断 f[j] == g[j] 是否成立。
  3. 若相等,则 j 即为中心下标;若遍历结束未找到,返回 -1。

注意:对于边界情况,最左侧元素的左侧和为 0,最右侧元素的右侧和也为 0。

C++ 代码实现

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n), g(n);
        
        // f[0] 默认为 0,无需显式赋值
        for (int i = 1; i < n; i++) {
            f[i] = f[i - 1] + nums[i - 1];
        }
        
        // g[n-1] 默认为 0,无需显式赋值
        for (int i = n - 2; i >= 0; i--) {
            g[i] = g[i + 1] + nums[i + 1];
        }
        
        for (int j = 0; j < n; j++) {
            if (f[j] == g[j]) {
                return j;
            }
        }
        
        return -1;
    }
};

28. 除自身以外数组的乘积

题目描述

给你一个整数数组 nums,请你返回一个数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

约束条件:

  • 不能使用除法。
  • 时间复杂度需控制在 O(N)。

解题思路

既然不能用除法,且要求线性时间复杂度,暴力枚举显然不可行。我们需要观察结果的结构。

对于任意位置 i,最终结果 ret[i] 由两部分组成:

  1. i 左侧所有元素的乘积:nums[0] * ... * nums[i-1]
  2. i 右侧所有元素的乘积:nums[i+1] * ... * nums[n-1]

这本质上就是前缀积和后缀积的结合。我们可以利用两个辅助数组来存储这些信息:

  • post[i]:记录 i 位置之前(左侧)所有元素的前缀乘积。
  • suf[i]:记录 i 位置之后(右侧)所有元素的后缀乘积。

最后将对应位置的乘积相乘即可得到结果。

C++ 代码实现

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n), g(n), ret(n);
        
        // 初始化边界值,乘法单位元为 1
        f[0] = 1;
        g[n - 1] = 1;
        
        // 计算左侧前缀乘积
        for (int i = 1; i < n; i++) {
            f[i] = f[i - 1] * nums[i - 1];
        }
        
        // 计算右侧后缀乘积
        for (int j = n - 2; j >= 0; j--) {
            g[j] = g[j + 1] * nums[j + 1];
        }
        
        // 合并结果
        for (int i = 0; i < n; i++) {
            ret[i] = f[i] * g[i];
        }
        
        return ret;
    }
};

总结

这两个问题都展示了前缀和(或前缀积)思想在数组处理中的强大之处。

  1. 空间换时间:通过预处理构建辅助数组,将原本需要重复计算的子问题结果缓存起来,从而将时间复杂度从 O(N²) 降低到 O(N)。
  2. 边界处理:在处理首尾元素时,要注意初始值的设定(求和为 0,求积为 1),这是容易出错的地方。
  3. 扩展性:这种模式不仅适用于求和与乘积,还可以推广到其他可结合运算的场景中。

目录

  1. 算法实战:前缀和技巧解中心下标与数组乘积问题
  2. 27. 寻找数组的中心下标
  3. 题目描述
  4. 解题思路
  5. C++ 代码实现
  6. 28. 除自身以外数组的乘积
  7. 题目描述
  8. 解题思路
  9. C++ 代码实现
  10. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 百度为何不做 Sora:解析其多模态技术路线与 iRAG 策略
  • MySQL 性能优化实战:索引、查询与架构建议
  • Linux 进程概念
  • GitHub 分支保护规则设置:禁止直接 Push 强制 Pull Request
  • Spring Security OAuth2 实战:从授权服务器到微服务网关
  • Spring AI Alibaba 短期记忆与长期记忆实现原理
  • SpringBoot+Vue 智能推荐卫生健康系统平台设计与实现
  • VS Code 安装 OpenCode 插件及本地 AI 代码补全配置
  • 前端 Base64 格式文件上传详解:原理、实现与最佳实践
  • 漫画脸描述生成实战:构建 Stable Diffusion WebUI 提示词结构
  • FPGA 数字运算与控制:浮点数及 PID 实现
  • OpenClaw 集成飞书机器人部署教程
  • GitHub 启用双因素身份验证 2FA 配置教程
  • 算法专题:模拟算法实战(替换问号、提莫攻击、Z 字形变换等)
  • Stable Diffusion v4.10 与 ComfyUI 整合包使用指南(秋葉版)
  • Android 工程师职业发展:转行抉择与深耕策略
  • 本地离线部署 Whisper 模型实现语音转写
  • C++ 模板详解(进阶)
  • AI绘画电商产品提示词撰写指南
  • 彻底告别 Python 版本混乱:uv 工具让环境管理变得轻松优雅

相关免费在线工具

  • 加密/解密文本

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