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

题目说明

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

  • 提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

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

  • 进阶:
    你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

示例

示例 1:

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

笔者理解

此题是一道数组算法问题,在力扣题库中被定义为中等题。

解法

当笔者阅读完此题后,*因为一个 数组内除当前元素其他元素的乘积等于 其左累乘 * 右累乘,我们可以采用左右前缀累乘的方式*,让我们来看看具体如何实现的吧。

实现

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
26
27
class Solution {
/**
* 数组
* 前缀和
*/
public int[] productExceptSelf(int[] nums) {
int n = nums.length;

// 一个数组内除当前元素其他元素的乘积等于 其左累乘 * 右累乘
int[] result = new int [n];

// 先当前元素左边的所有元素累乘并存储
result[0] = 1;
for (int i = 1; i < n; i++) {
result[i] = result[i - 1] * nums[i - 1];
}

// 再将右边的元素累乘
int right = 1;
for (int i = n - 1; i >= 0; i--) {
result[i] *= right;
right *= nums[i];
}

return result;
}
}

时间和空间效率还行,可见此解法还比较适合此题。

image-20210920110744027

总结

本题是今天的一题,难度是为中等,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。