238 除自身以外数组的乘积
2025年3月10日大约 2 分钟
📚 相关链接
📝 题目描述
给定一个整数数组 nums
,返回数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
要求:
- 不要使用除法,且在 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 <= nums.length <= 10^5
-30 <= nums[i] <= 30
- 输入保证数组
answer[i]
在 32 位整数范围内
🔍 进阶
可以在 O(1) 的额外空间复杂度内完成这个题目吗?(出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
💭 思路
维护两个数组,一个
prefix
一个suffix
,使用两个循环填充这两个数组:prefix[i]
为第i
个元素之前的所有元素的乘积suffix[i]
为第i
个元素之后的所有元素的乘积
因此,
ans[i] = prefix[i] * suffix[i]
。进阶实现
由于输出数组不算额外空间,所以先将
prefix
放进ans
,再把suffix
乘到ans
上。
💻 代码实现
1. 维护两个数组
public int[] productExceptSelf(int[] nums) {
if (nums.length == 2) {
return new int[]{nums[1], nums[0]};
}
int[] ans = new int[nums.length];
int[] pre = new int[nums.length];
int[] suf = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if (i == 0) {
pre[i] = 1;
} else {
pre[i] = pre[i - 1] * nums[i - 1];
}
}
for (int i = nums.length - 1; i >= 0; i--) {
if (i == nums.length - 1) {
suf[i] = 1;
} else {
suf[i] = suf[i + 1] * nums[i + 1];
}
}
for (int i = 0; i < nums.length; i++) {
ans[i] = pre[i] * suf[i];
}
return ans;
}
2. 动态维护 suffix
和 prefix
public int[] productExceptSelf(int[] nums) {
if (nums.length == 2) {
return new int[]{nums[1], nums[0]};
}
int[] ans = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if (i == 0) {
ans[i] = 1;
} else {
ans[i] = ans[i - 1] * nums[i - 1];
}
}
int R = 1;
for (int i = nums.length - 1; i >= 0; i--) {
ans[i] *= R;
R *= nums[i];
}
return ans;
}