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

算法实战:寻找数组中心下标与除自身外数组乘积(前缀和技巧)

前缀和算法在数组处理中的应用。通过预处理左右两侧的和或积,将时间复杂度优化至 O(N)。涵盖寻找数组中心下标及计算除自身外数组乘积两个经典问题,展示如何利用空间换时间的策略解决边界条件与遍历效率问题。

星云发布于 2026/3/29更新于 2026/7/2030 浏览
算法实战:寻找数组中心下标与除自身外数组乘积(前缀和技巧)

算法实战:前缀和进阶

在数组处理问题中,前缀和(Prefix Sum)是一种将区间查询优化到 O(1) 的经典技巧。今天我们来深入两个典型场景:寻找数组的中心下标,以及计算除自身以外数组的乘积。这两个问题看似不同,核心都在于利用预处理降低时间复杂度。

27. 寻找数组的中心下标

题目描述: 给定一个整数数组 nums,找到并返回该数组的中心下标。如果不存在,则返回 -1。 中心下标是指左侧所有元素之和等于右侧所有元素之和的下标。

题目示例

解题思路: 直观的想法是遍历每个位置,分别计算左边和右边的和。但这样会导致 O(N^2) 的复杂度。我们可以利用前缀和的思想进行优化:

  1. 预处理:构建两个辅助数组。f[i] 存储 nums[0] 到 nums[i-1] 的和(即 i 左侧的和),g[i] 存储 nums[i+1] 到 nums[n-1] 的和(即 i 右侧的和)。
  2. 枚举判断:遍历数组,当 f[i] == g[i] 时,当前下标即为所求。
  3. 边界处理:注意首尾元素的左右和默认为 0。

代码实现:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return -1;
        
        // f[i] 表示 i 左侧所有元素的和
        vector<int> f(n, 0);
        // g[i] 表示 i 右侧所有元素的和
        vector<int> g(n, 0);
        
        // 计算左侧前缀和
        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 (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)。

题目示例

解题思路: 既然不能用除法,那就不能先算总乘积再除以当前值。我们需要把结果拆分为两部分:

  1. 当前位置左侧所有元素的乘积(前缀积)。
  2. 当前位置右侧所有元素的乘积(后缀积)。

最终结果 answer[i] = left_product[i] * right_product[i]。

具体步骤如下:

  1. 初始化 f 数组记录左侧乘积,g 数组记录右侧乘积。
  2. 正向遍历填充 f,反向遍历填充 g。
  3. 合并结果。

代码实现:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n, 1); // 左侧乘积,初始化为 1
        vector<int> g(n, 1); // 右侧乘积,初始化为 1
        vector<int> ret(n);
        
        // 计算左侧前缀积
        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;
    }
};

总结: 这两个问题都展示了前缀和(或前缀积)的核心价值:通过一次线性扫描预处理数据,将后续的查询操作从 O(N) 降为 O(1)。在处理涉及区间统计、累积运算的题目时,优先考虑这种空间换时间的策略,往往能避开暴力解法的性能瓶颈。

目录

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

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

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

更多推荐文章

查看全部
  • AI 辅助游戏开发:基于 DeepSeek 实现贪吃蛇项目
  • 浏览器桌面通知功能从零实现指南
  • 二叉树深度计算与先序排列重构实战
  • 2025 年 3 月 GESP 真题解析:C++ 八级选择题与判断题
  • IntelliJ IDEA Python 开发环境配置与实战
  • Git 配置与使用详解
  • 基于 Docker、Playwright 与 Jenkins 的 Web 自动化测试实践
  • Python 开源 AI 模型引入及测试全流程实战
  • Lit 与 Alpine.js:轻量级前端开发的两种路径
  • 从 J2EE 到 Agentic AI:OpenClaw 如何复现 Spring 的轻量级革命
  • Python Selenium 自动化测试实战:从入门到企业级应用
  • 鸿蒙金融理财全栈项目:生态合作、用户运营与数据变现
  • 机器学习 KNN 算法原理及 C++/Python 实战实现
  • 大模型微调的技术含量与实施策略深度解析
  • AI 鸿蒙 App 开发:从页面到能力系统的架构演变
  • 使用文心一言为智能体设计稳定调用工作流的提示词
  • N8N 对接飞书多维表:数据增删改查实战指南
  • SQL 性能优化:连接条件下推技术原理与实践
  • Dify v1.12.0 集成 DeepSeek-V3:LoRA 微调与流式响应优化
  • 2024 生成式人工智能指南:大模型行业应用与开发实战

相关免费在线工具

  • 加密/解密文本

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