essay
hot100-除了自身以外数组的乘积
#算法
hot100——除了自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除了 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 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 <= 105
-30 <= nums[i] <= 30
输入 保证 数组 answer[i] 在 32 位 整数范围内
解
func productExceptSelf(nums []int) []int {
// 创建结果数组,长度与输入数组相同
result := make([]int, len(nums))
// 第一步:计算每个元素左侧所有元素的乘积
// 第一个元素左侧没有元素,所以初始化为1
result[0] = 1
// 遍历数组,计算每个位置左侧所有元素的乘积
// 例如:result[i] = nums[0] × nums[1] × ... × nums[i-1]
for i := 1; i < len(nums); i++ {
// 当前元素的左侧乘积 = 前一个元素的左侧乘积 × 前一个元素的值
result[i] = result[i-1] * nums[i-1]
}
// 第二步:计算每个元素右侧所有元素的乘积,并乘到结果中
// 使用变量 right 记录当前元素右侧所有元素的乘积
// 从最后一个元素开始向左遍历
right := 1
// 从后向前遍历数组
for i := len(nums)-1; i >= 0; i-- {
// 关键步骤:先使用当前的right(不包含nums[i])
// result[i]当前存储的是左侧乘积,乘以right得到最终结果
result[i] = result[i] * right
// 然后更新right,将当前元素乘入right
// 更新后的right将作为下一个(左侧)元素的右侧乘积
right = right * nums[i]
}
// 返回最终结果
return result
}