LeetCode 力扣 热题 100道(二十七)除自身以外数组的乘积(C++)
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> answer(n, 1);
// 计算前缀积
int prefix = 1;
for (int i = 0; i < n; ++i) {
answer[i] = prefix; // 当前元素的前缀积
prefix *= nums[i]; // 更新前缀积
}
// 计算后缀积并更新答案
int suffix = 1;
for (int i = n - 1; i >= 0; --i) {
answer[i] *= suffix; // 乘以当前元素的后缀积
suffix *= nums[i]; // 更新后缀积
}
return answer;
}
};
前缀积:
遍历数组,计算每个元素的左侧所有元素的乘积。
存储在 answer[i]
中。
后缀积:
反向遍历数组,计算每个元素右侧所有元素的乘积。
将后缀积与 answer[i]
相乘,得到结果。
优化空间:
在同一个数组 answer
中存储前缀积和最终结果,避免额外空间分配。