题目描述:
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
初始方法步骤
-
初始化数组:
- 创建两个数组
Premulti
和Lastmulti
,它们的大小与输入数组nums
相同,初始化为1
。 - 创建一个结果数组
answer
。
- 创建两个数组
-
计算前缀乘积:
- 遍历
nums
数组,从左到右填充Premulti
:Premulti[i] = Premulti[i - 1] * nums[i - 1]
。
- 遍历
-
计算后缀乘积:
- 遍历
nums
数组,从右到左填充Lastmulti
:Lastmulti[i] = Lastmulti[i + 1] * nums[i + 1]
。
- 遍历
-
计算最终结果:
- 对于每个元素,
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;
}
};
优化解题思路
-
前缀乘积:
- 创建一个数组
answer
,用来存储每个位置的前缀乘积。 - 对于每个元素
nums[i]
,我们可以计算前面所有元素的乘积。
- 创建一个数组
-
后缀乘积:
- 我们可以在遍历的过程中使用一个变量来存储当前的后缀乘积。
- 从数组的最后一个元素开始,向前遍历,更新
answer
数组中的值。
优化实现步骤
-
初始化:
- 创建一个
answer
数组,大小与nums
相同,并初始化为1
。
- 创建一个
-
计算前缀乘积:
- 从左到右遍历
nums
,在answer
中填充前缀乘积。 answer[i]
保存nums[0]
到nums[i-1]
的乘积。
- 从左到右遍历
-
计算后缀乘积:
- 使用一个变量
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;
}
};