LeetCode238 除自身以外数组的乘积

56 阅读1分钟

leetcode.cn/problems/pr… image.png

解法一:前后缀分解,左右乘积数组

func productExceptSelf(nums []int) []int {
    // 左乘积数组
    leftProductList := make([]int, len(nums))
    // leftProductList[i]表示除该元素,左边所有元素的乘积
    leftProductList[0] = 1 // 第一个数左边没有数
    for i := 1; i<len(nums); i++{
        leftProductList[i] = leftProductList[i-1] * nums[i-1] 
    }

    // 右乘积数组
    rightProductList := make([]int, len(nums))
    // rightProductList[i]表示除该元素,右边所有元素的乘积
    rightProductList[len(nums)-1] = 1 // 最后一个数右边没有数
    for i := len(nums)-2; i>=0; i--{
        rightProductList[i] = rightProductList[i+1] * nums[i+1]
    }

    // 左侧所有数字的乘积和右侧所有数字的乘积(即前缀与后缀)相乘得到答案
    res := make([]int, len(nums))
    for i := 0; i<len(nums); i++{
        res[i] = leftProductList[i]*rightProductList[i]
    }
    return res
}

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

可以进一步优化空间复杂度

func productExceptSelf(nums []int) []int {
    n := len(nums)
    // rightProductList[i] 表示从 nums[i+1] 到 nums[len−1] 的乘积,初始为1
    rightProductList := make([]int, n)
    rightProductList[n-1] = 1
    for i := n-2; i >= 0; i--{
        rightProductList[i] = rightProductList[i+1]*nums[i+1]
    }

    leftProduct := 1 // 表示从 nums[0] 到 nums[i−1] 的乘积,初始为1
    for i:=0; i<n; i++{
        // 此时 leftProduct 已经为 nums[0] 到 nums[i-1] 的乘积,直接乘到 rightProductList[i] 中
        rightProductList[i] = rightProductList[i]*leftProduct
        leftProduct = leftProduct * nums[i]
    }
    // rightProductList直接作为答案
    return rightProductList
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1),输出数组不视为额外空间