除自身以外数组的乘积

238. 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

不要使用除法,且在 O(*n*) 时间复杂度内完成此题。

示例 1:

1
2
输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:

1
2
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

提示:

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

前缀和后缀数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] lsum = new int[len];
int[] rsum = new int[len];
int[] ans = new int[len];
// L[i] 为索引 i 左侧所有元素的乘积
// 对于索引为 '0' 的元素,因为左侧没有元素,所以 L[0] = 1
lsum[0] = 1;
for(int i = 1; i <= len; i++){
lsum[i] = lsum[i-1] * nums[i-1];
}
// R[i] 为索引 i 右侧所有元素的乘积
// 对于索引为 'length-1' 的元素,因为右侧没有元素,所以 R[length-1] = 1
rsum[len-1] = 1;
for(int i = len-2; i >= 0; i--){
rsum[i] = rsum[i+1] * nums[i+1];
}
for(int i = 0; i < len; i++){
ans[i] = lsum[i] * rsum[i];
}
return ans;

}
}

时间复杂度:$O(n)$

空间复杂度:$O(n)$

直接在ans数组上操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] ans = new int[len];
//先计算下标i左侧的乘积
ans[0] = 1;
for(int i = 1; i < len; i++){
ans[i] = ans[i-1] * nums[i-1];
}
//rsum表示下标i右侧的乘积
int rsum = 1;
for(int i = len-1; i >= 0; i--){
ans[i] = ans[i] * rsum;
rsum *= nums[i];
}

return ans;

}
}

时间复杂度:$O(n)$

空间复杂度:$O(1)$


除自身以外数组的乘积
http://example.com/2024/04/25/算法/数组/13. 除自身以外的数组乘积/
作者
PALE13
发布于
2024年4月25日
许可协议