238. Product of Array Except Self
题目大意
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
Example 1:
- Input:
nums = [1,2,3,4]
- Output:
[24,12,8,6]
Example 2:
- Input:
nums = [-1,1,0,-3,3]
- Output:
[0,0,9,0,0]
Constraints
2 <= nums.length <= 10^5
-30 <= nums[i] <= 30
nums
的任何前缀或后缀的乘积都保证适合在 32 位整数中表示。
Follow up
能否在 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;
}
};