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
}
comments如果有不同意见或者补充,直接留在这里。
contact

在别处继续找到我

如果你想聊技术、设计,或者只是打个招呼。

暂未配置外部链接