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

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

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

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

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

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 + ];
        }
        
         ( j = ; j < n; j++) {
             (f[j] == g[j]) {
                 j;
            }
        }
        
         ;
    }
};
1
for
int
0
if
return
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

更多推荐文章

查看全部
  • .NET 开源分布式事务解决方案:CAP
  • 从三年前端到 CS 硕士:我在韩国留学的得失复盘
  • SimpleBGC 三轴稳像平台硬件电路设计解析
  • Git 分支管理核心操作与策略
  • 基于 Java 的同城家政智能派单系统构建
  • ChatGPT 核心功能与实战技巧指南
  • 2026 年学术写作辅助工具指南:降低 AIGC 痕迹的实用方案
  • 在 Linux Ubuntu 上安装 Qt 5 详细教程
  • WorkBuddy 配置 QQ 机器人指南
  • 渗透测试基础入门:概念、术语与协议详解
  • 深入解剖STL map/multimap:接口使用与核心特性详解
  • Go 与 Python 技术选型及职业发展方向对比
  • 中国人民大学大模型综述书籍发布及核心内容解析
  • JDK 23 在 Windows 11 下的安装与环境变量配置指南
  • ES6 基础语法:变量声明与解构
  • Spring Cloud 微服务远程调用:OpenFeign 实战
  • Xilinx FPGA ISERDES 高速串行数据转换详解
  • 物理模拟稳定性优化:4种C++控制模式实战
  • DeepSeek-R1-Distill-Qwen-1.5B 本地部署:vLLM 与 Open WebUI 实战
  • 神经网络概率语言模型(NPLM)阅读笔记

相关免费在线工具

  • 加密/解密文本

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