【力扣150&Golang】除自身以外数组的乘积

题目:

给你一个整数数组 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]

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

解法

        在不使用除法且在 O(n) 时间复杂度内完成这道题,可以引入两个与nums等长的数组,分别存储nums[i]左右两侧元素的乘积,最后将两者相乘,即可得到结果answer[i]。
        在此基础上,我们可以使用两个变量来计算并存储左右乘积,从而代替存储左右乘积的数组,降低空间复杂度。

时间复杂度:O(n)
空间复杂度:O(1)

代码

func productExceptSelf(nums []int) []int {
    
    
    n := len(nums)
    answer := make([]int, n)

    // 计算左侧乘积
    left := 1
    for i := 0; i < n; i++ {
    
    
        answer[i] = left 
        left *= nums[i]
    }

    // 计算右侧乘积并更新结果
    right := 1
    for i := n - 1; i >= 0; i-- {
    
    
        answer[i] *= right 
        right *= nums[i]
    }

    return answer
}

猜你喜欢

转载自blog.csdn.net/qq_42638506/article/details/142824032