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

🔥个人主页: 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;
    }
};
相关推荐
旖-旎2 分钟前
《LeetCode 130 被围绕的区域 FloodFill DFS 解法》
c++·算法·深度优先·力扣·floodfill
林森lsjs4 分钟前
斐波那契数列的 N 种解法:从递归到动态规划的优化之路【算法思考】
算法·动态规划
apcipot_rain1 小时前
计科八股20260616(1)——堆存中位数、链表判环、黑白测试、敏捷开发与瀑布模型、配置管理、持续集成、池化
数据结构·算法·软件工程
闵孚龙7 小时前
动态图机制:为什么 PyTorch 调试起来更舒服
人工智能·pytorch·python
JAVA面经实录9177 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
chushiyunen8 小时前
langchain4j笔记、tools
笔记·python·flask
程序员三藏8 小时前
Web自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
武清伯MVP9 小时前
前端跨域方案大合集
前端·javascript
在放️9 小时前
Python 爬虫 · 第三方代理接入与合规使用
开发语言·爬虫·python
开源Z9 小时前
LeetCode 42 · 接雨水:从暴力到双指针的三步优化
算法·leetcode