Leetcode 238. 除自身以外数组的乘积 中等 数组

238. 除自身以外数组的乘积

题目

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

请不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

[1,2,3,4]
[24,12,8,6]

思路1:

使用L记录i左侧数的乘积,L[0]=0,R记录右侧的乘积,ret[i]=L[i]*R[i]

时间和空间复杂度都为O(n)

复制代码
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        vector<int> L(n);
        vector<int> R(n);
        L[0]=1;
        for(int i=1;i<n;++i)
            L[i]=L[i-1]*nums[i-1];
        R[n-1]=1;
        for(int i=n-2;i>=0;--i)
            R[i]=R[i+1]*nums[i+1];
        vector<int> answer(n);
        for(int i=0;i<n;++i)
            answer[i]=L[i]*R[i];
        return answer;
    }
};
复制代码

 

思路2:

使用answer用作记录L,然后用一个参数R记录R,先走一遍L流程,

然后走R流程时直接用answer*R,同时R*=nums[i]

这样空间复杂度O(1)

复制代码
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        vector<int> answer(n);
        answer[0]=1;
        for(int i=1;i<n;++i)
            answer[i]=answer[i-1]*nums[i-1];
        int R=1;
        for(int i=n-1;i>=0;--i){
            answer[i]=answer[i]*R;
            R*=nums[i];
        }
        return answer;
    }
};
复制代码

 

posted @   鸭子船长  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示