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

🔥个人主页: 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;
    }
};
相关推荐
jaysee-sjc几秒前
十七、Java 高级技术入门全解:JUnit、反射、注解、动态代理
java·开发语言·算法·junit·intellij-idea
yongui478343 分钟前
MATLAB模糊控制的粒子群算法(Fuzzy-PSO)实现
数据结构·算法·matlab
sali-tec4 分钟前
C# 基于OpenCv的视觉工作流-章49-人脸检测
图像处理·人工智能·opencv·算法·计算机视觉
不爱吃炸鸡柳5 分钟前
4道经典算法题代码详解:从两数之和到链表两两交换
算法·链表·哈希算法
juniperhan8 分钟前
Flink 系列第 3 篇:核心概念精讲|分布式缓存 + 重启策略 + 并行度 底层原理 + 代码实战 + 生产规范
大数据·分布式·缓存·flink
斯班奇的好朋友阿法法8 分钟前
Django 项目打包部署完整指南(适配你的项目,零报错)
python·django·sqlite
林开落L8 分钟前
【项目实战】博客系统完整测试报告(含自动化+性能测试)
python·功能测试·jmeter·自动化·postman·性能测试·xmind
蓝黑20209 分钟前
Vue组件通信之slot
前端·javascript·vue
JustNow_Man9 分钟前
【opencode】使用方法
linux·服务器·网络·人工智能·python
cmpxr_10 分钟前
【C】隐式类型转换
c语言·c++·算法