🧩Algo 普通数组
238. 除自身以外数组的乘积
难度:🟡 Medium | 标签:前缀积、数组 | 状态:⬜ LeetCode 链接
思路
不能用除法,且 O(1) 额外空间(结果数组不算)。
两次扫描:
- 第一遍:
res[i]= 左侧所有元素的乘积 - 第二遍:用变量
right维护右侧累积,乘进res[i]
代码
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> res(n, 1);
for (int i = 1; i < n; ++i) res[i] = res[i - 1] * nums[i - 1];
int right = 1;
for (int i = n - 1; i >= 0; --i) {
res[i] *= right;
right *= nums[i];
}
return res;
}
};
复杂度
- 时间 O(n),空间 O(1)(不计输出)
易错 / 回顾
- 不允许除法(题目要求)—— 因为有 0 时直接除会错
- 第二遍要用一个标量
right,不能再开数组 - 0 的处理天然正确:左积 / 右积自动跳过自己
Related · 普通数组