news 2026/9/23 7:22:39

普通数组-----除了自身以外数组的乘积

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
普通数组-----除了自身以外数组的乘积

🔥个人主页:Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目解析

这道题的核心是在不使用除法、且时间复杂度为O(n)的前提下,计算数组中每个元素除自身外所有元素的乘积。

直接暴力计算每个位置的乘积会导致O(n²)的时间复杂度,无法满足题目要求。我们可以利用前缀和后缀乘积的思路来高效解决这个问题。

思路分析

  1. 前缀乘积数组v1

    • v1[i]表示nums[0]nums[i-1]的乘积
    • 例如,v1[0] = 1(没有前缀元素),v1[1] = nums[0]v1[2] = nums[0] * nums[1]
  2. 后缀乘积数组v2

    • v2[i]表示nums[i+1]nums[n-1]的乘积
    • 例如,v2[n-1] = 1(没有后缀元素),v2[n-2] = nums[n-1]
  3. 结果计算

    • 对于每个位置i,除自身外的乘积就是v1[i] * v2[i]

完整代码

cpp

class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> v1(n, 1); vector<int> v2(n, 1); // 计算前缀乘积 for (int i = 1; i < n; ++i) { v1[i] = v1[i-1] * nums[i-1]; } // 计算后缀乘积 for (int i = n-2; i >= 0; --i) { v2[i] = v2[i+1] * nums[i+1]; } // 计算结果 vector<int> ret(n); for (int i = 0; i < n; ++i) { ret[i] = v1[i] * v2[i]; } return ret; } };

复杂度分析

  • 时间复杂度:O(n)
    • 我们只进行了三次线性遍历,分别计算前缀乘积、后缀乘积和最终结果。
  • 空间复杂度:O(n)
    • 主要来自前缀和后缀两个辅助数组。
    • 可以优化到 O (1) 额外空间:直接在结果数组上先计算前缀乘积,再反向遍历计算后缀乘积并累积。

优化思路(O (1) 额外空间)

我们可以把结果数组先作为前缀乘积数组,然后用一个变量动态维护后缀乘积,从而去掉v2数组,将空间复杂度降为 O (1)。

cpp

class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> ret(n, 1); // 前缀乘积存入结果数组 for (int i = 1; i < n; ++i) { ret[i] = ret[i-1] * nums[i-1]; } // 动态维护后缀乘积并更新结果 int suffix = 1; for (int i = n-1; i >= 0; --i) { ret[i] *= suffix; suffix *= nums[i]; } return ret; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 23:30:47

安卓驱动开发工程师:深入技术核心,驱动智能未来

深圳达实智能股份有限公司 安卓驱动开发工程师 职位信息 负责安卓系统底层驱动的设计、开发、调试、集成与性能优化工作。 负责Android Framework及内核等系统框架层的调优,关键模块开发实现及调试定位。 系统API设计和开发,安卓SDK定制和维护。 二、 任职要求: 1. 基础要求…

作者头像 李华
网站建设 2026/9/21 2:37:26

协鑫集成高级AI开发工程师职位深度解析:职责、能力与面试指南

协鑫集成 高级AI开发工程师 职位信息 职位详情: 1.探索、跟踪国内外领先的AI技术、产品方案,推动其在公司内应用,提升企业运营效率,生产效率。 2.协调各部门团队,包括研发、工艺、生产、职能等,确保AI项目目标实现。 3.结合AI背景和行业需求,为企业数字化、智能化提供指…

作者头像 李华
网站建设 2026/9/20 23:11:34

Snapd和Apt—Linux 上两种完全不同的软件包管理系统

Snapd 和 Apt 是 Linux 上两种完全不同的软件包管理系统&#xff0c;各有优劣。以下是详细对比&#xff1a; 核心区别一览 特性Apt (传统)Snapd (现代)设计年代1998年 (Debian)2014年 (Ubuntu)软件包格式.deb.snap依赖处理共享系统库&#xff0c;自动解决依赖自带所有依赖&…

作者头像 李华
网站建设 2026/9/22 2:46:40

ESP32 的宝藏开源项目:ESP32 - Bus - Pirate 打造硬件调试瑞士军刀

大家好&#xff0c;我是杂烩君。当你手里拿着一个ESP32开发板&#xff0c;除了做物联网项目&#xff0c;还能干什么&#xff1f; 可以借助ESP32-Bus-Pirate把ESP32板子变成了一把"瑞士军刀"&#xff0c;能够与20多种数字协议和无线协议进行交互。 1. ESP32-Bus-Pir…

作者头像 李华
网站建设 2026/9/21 23:09:18

【ICLR26-加州大学】GEN2SEG:生成模型实现可泛化的实例分割

文章&#xff1a;GEN2SEG: GENERATIVE MODELS ENABLE GENERALIZABLE INSTANCE SEGMENTATION代码&#xff1a;https://reachomk.github.io/gen2seg单位&#xff1a;加州大学戴维斯分校一、问题背景人类仅凭有限经验就能识别各类陌生物体&#xff0c;而传统视觉模型的“零样本迁移…

作者头像 李华
网站建设 2026/9/20 6:36:15

股市估值差异对国际技术标准制定的影响

股市估值差异对国际技术标准制定的影响关键词&#xff1a;股市估值差异、国际技术标准制定、技术创新、市场竞争、产业发展摘要&#xff1a;本文深入探讨了股市估值差异对国际技术标准制定的影响。首先介绍了研究的背景、目的、范围以及预期读者等内容。接着阐述了股市估值差异…

作者头像 李华