238. 除自身以外数组的乘积
type
status
date
slug
summary
tags
category
difficulty
icon
password
238. 除自身以外数组的乘积
给你一个整数数组
nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。题目数据 保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在
O(n)
时间复杂度内完成此题。示例 1:
示例 2:
提示:
2 <= nums.length <= 105
30 <= nums[i] <= 30
- 输入 保证 数组
answer[i]
在 32 位 整数范围内
解题思路:
代码分析:
这道题的解题思路是利用前缀和后缀乘积的思想,通过两次遍历完成计算。具体步骤如下:
- 初始化:创建一个长度为n的结果数组res,所有元素初始化为1
- 第一次遍历(从左到右):
- 计算每个位置左边所有数字的乘积
- res[i] = res[i-1] * nums[i-1]
- 此时res[i]存储了nums[0]到nums[i-1]的乘积
- 第二次遍历(从右到左):
- 使用变量s记录右边的乘积,初始值为1
- 对于每个位置i:
- res[i] *= s (将左边的乘积和右边的乘积相乘)
- s *= nums[i] (更新右边的乘积)
时间复杂度:O(n),需要两次遍历数组
空间复杂度:O(1),除了输出数组外,只使用了常数空间
举例说明:
对于输入数组 nums = [1,2,3,4]:
- 第一次遍历后,res = [1,1,2,6]
- res[0] = 1(初始值)
- res[1] = 1 * 1 = 1
- res[2] = 1 * 2 = 2
- res[3] = 2 * 3 = 6
- 第二次遍历(s表示右边的乘积):
- i=3: s=1, res[3] = 6*1 = 6, s=4
- i=2: s=4, res[2] = 2*4 = 8, s=12
- i=1: s=12, res[1] = 1*12 = 12, s=24
- i=0: s=24, res[0] = 1*24 = 24
最终输出:[24,12,8,6]
- 作者:Episkey
- 链接:https://episkey.top/article/product-of-array-except-self
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。