文章目录
1.题目
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 **不要使用除法,**且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
2.思路
计算每个元素左侧的乘积并存储在 left
数组中,计算的区间是0到i-1,数组所有元素初始化为1
计算每个元素右侧的乘积并存储在 right
数组中,计算的区间是i+1到n-1,数组所有元素初始化为1
通过将 left
和 right
数组对应位置的乘积赋值给结果数组 result
,从而得到每个元素除自身以外的所有元素的乘积
注意,边界问题,left的第一个元素要初始化为1,right的最后一个元素要初始化为1
3.代码
c++
#include <vector>
class Solution {
public:
std::vector<int> productExceptSelf(std::vector<int>& nums) {
int n = nums.size();
// 初始化左侧乘积数组,初始值为1
std::vector<int> left(n, 1);
// 初始化右侧乘积数组,初始值为1
std::vector<int> right(n, 1);
// 初始化结果数组
std::vector<int> result(n);
// 计算左侧乘积
for (int i = 1; i < n; ++i) {
// left[i] 存储的是 nums[i] 左侧所有元素的乘积
left[i] = left[i - 1] * nums[i - 1];
}
// 计算右侧乘积
for (int i = n - 2; i >= 0; --i) {
// right[i] 存储的是 nums[i] 右侧所有元素的乘积
right[i] = right[i + 1] * nums[i + 1];
}
// 计算结果数组
for (int i = 0; i < n; ++i) {
// result[i] 是 left[i] 和 right[i] 的乘积
result[i] = left[i] * right[i];
}
return result;
}
};