Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].
The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
You must write an algorithm that runs in O(n) time and without using the division operation.
给定一个整数数组 nums
,返回一个数组 answer
,使得 answer[i]
等于除 nums[i]
之外的 nums
的所有元素的乘积。
nums
的任何前缀或后缀的乘积都保证适合在 32 位整数中表示。
你必须编写一个时间复杂度为 O(n) 的算法,并且不使用除法运算。
Example 1:
nums = [1,2,3,4]
[24,12,8,6]
Example 2:
nums = [-1,1,0,-3,3]
[0,0,9,0,0]
2 <= nums.length <= 10^5
-30 <= nums[i] <= 30
nums
的任何前缀或后缀的乘积都保证适合在 32 位整数中表示。能否在 O(1) 额外空间复杂度内解决问题?(输出数组不计入空间复杂度分析)
这段代码的目的是计算一个数组 nums
,使得每个元素 answer[i]
等于除了 nums[i]
之外的所有元素的乘积。
定义临时变量left
记录当前位置之前所有元素的乘积,right
记录当前位置之后所有元素的乘积。
算法的关键步骤如下:
初始化结果数组:
nums
大小相同的数组 answers
,用于存储最终的乘积结果。计算左侧乘积:
left
为1,用于存储当前索引左侧所有元素的乘积。nums
数组,对于每个索引 i
,将 left
赋值给 answers[i]
,然后更新 left
为 left * nums[i]
。这样,answers[i]
就存储了索引 i
左侧所有元素的乘积。计算右侧乘积并合并结果:
right
为1,用于存储当前索引右侧所有元素的乘积。nums
数组,对于每个索引 i
,将 answers[i]
乘以 right
,然后更新 right
为 right * nums[i]
。这样,answers[i]
就同时包含了索引 i
左侧和右侧所有元素的乘积。返回结果:
answers
数组。class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> answers(nums.size());
int left = 1, right = 1;
for (int i = 0; i < nums.size(); i++) {
answers[i] = left;
left *= nums[i];
}
for (int i = nums.size() - 1; i >= 0; i--) {
answers[i] = answers[i] * right;
right *= nums[i];
}
return answers;
}
};