LeetCode 238. 除了自身以外数组的乘积
题目描述
思路分析
解法一:前缀积 + 后缀积(推荐)
核心思路:
- 结果
res[i]等于左侧前缀积与右侧后缀积的乘积。- 第一次遍历构造左侧前缀积,第二次从右往左把后缀积乘入结果。
- 不需要额外数组保存后缀积,仅用一个变量滚动维护。
复杂度分析:
- 时间复杂度:O(n),其中 n 为数组长度。
- 空间复杂度:O(1),不计输出数组。
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] res = new int[n];
res[0] = 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;
}
}
func productExceptSelf(nums []int) []int {
n := len(nums)
res := make([]int, n)
res[0] = 1
// 构造左侧前缀积
for i := 1; i < n; i++ {
res[i] = res[i-1] * nums[i-1]
}
// 从右往左乘入后缀积
right := 1
for i := n - 1; i >= 0; i-- {
res[i] *= right
right *= nums[i]
}
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 42. 接雨水 | 困难 | 双指针 |
| 152. 乘积最大子数组 | 中等 | 动态规划 |
| 724. 寻找数组的中心下标 | 简单 | 前缀和 |
| 560. 和为 K 的子数组 | 中等 | 前缀和 |
| 1352. 最后 K 个数的乘积 | 中等 | 前缀积 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!