力扣238-除自身以外数组的乘积

题目描述:

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

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

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

初始方法步骤

  1. 初始化数组

    • 创建两个数组 Premulti 和 Lastmulti,它们的大小与输入数组 nums 相同,初始化为 1
    • 创建一个结果数组 answer
  2. 计算前缀乘积

    • 遍历 nums 数组,从左到右填充 Premulti
      • Premulti[i] = Premulti[i - 1] * nums[i - 1]
  3. 计算后缀乘积

    • 遍历 nums 数组,从右到左填充 Lastmulti
      • Lastmulti[i] = Lastmulti[i + 1] * nums[i + 1]
  4. 计算最终结果

    • 对于每个元素,answer[i] = Premulti[i] * Lastmulti[i]

初始代码实现:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        vector<int>Premulti(n,1);
        vector<int>Lastmulti(n,1);
        vector<int>answer(n);
        for(int i=1;i<n;i++){
            Premulti[i]=Premulti[i-1]*(nums[i-1]);
        }
        for(int i=n-2;i>=0;i--){//计算前置乘积
            Lastmulti[i]=Lastmulti[i+1]*nums[i+1];
        }
        for(int i=0;i<n;i++){//计算后置乘积
            answer[i]=Premulti[i]*Lastmulti[i];
        }
        return answer;
    }
};

优化解题思路

  1. 前缀乘积

    • 创建一个数组 answer,用来存储每个位置的前缀乘积。
    • 对于每个元素 nums[i],我们可以计算前面所有元素的乘积。
  2. 后缀乘积

    • 我们可以在遍历的过程中使用一个变量来存储当前的后缀乘积。
    • 从数组的最后一个元素开始,向前遍历,更新 answer 数组中的值。

优化实现步骤

  1. 初始化

    • 创建一个 answer 数组,大小与 nums 相同,并初始化为 1
  2. 计算前缀乘积

    • 从左到右遍历 nums,在 answer 中填充前缀乘积。
    • answer[i] 保存 nums[0] 到 nums[i-1] 的乘积。
  3. 计算后缀乘积

    • 使用一个变量 suffix 初始化为 1,从右到左遍历 nums,同时更新 answer
    • 对于每个 i,将 suffix 乘以 answer[i],然后更新 suffix 为 suffix * nums[i]

优化代码实现:

#include <vector>

using namespace std;

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> answer(n, 1);
        
        // 计算前缀乘积
        for (int i = 1; i < n; i++) {
            answer[i] = answer[i - 1] * nums[i - 1];
        }
        
        // 计算后缀乘积并与前缀乘积相乘
        int suffix = 1; // 后缀乘积初始化为1
        for (int i = n - 1; i >= 0; i--) {
            answer[i] *= suffix;  // 乘以当前的后缀
            suffix *= nums[i];     // 更新后缀乘积
        }
        
        return answer;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值