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

🔥个人主页: 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;
    }
};
相关推荐
Jerry15 小时前
LeetCode 160. 相交链表
算法
Lyn_Li15 小时前
扫描 PDF 歪了怎么办?用 6 种检测方法做本地批量扶正(附开源工具)
python·pdf·ocr·tesseract·开源工具·文档处理·本地处理·扫描件纠偏
Jerry15 小时前
LeetCode 19. 删除链表的倒数第 N 个结点
算法
金銀銅鐵16 小时前
费马小定理
python·数学·算法
code_pgf16 小时前
AI-Agent记忆机制分析
大数据·人工智能
Dxy123931021616 小时前
MySQL索引完整教程:创建、查看、修改、删除与日常管理
前端·javascript·mysql
技术不好的崎鸣同学17 小时前
[ACTF2020 新生赛]Exec 思路及解法
算法·安全·web安全
端庄的战斗机18 小时前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
Full Stack Developme18 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
cc57250265319 小时前
挑选大数据专业院校,重点参考哪几项指标
大数据