Featured image of post 剑指 Offer 66. 构建乘积数组

剑指 Offer 66. 构建乘积数组

题目描述

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积,即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。

示例:

  • 输入: [1,2,3,4,5]
  • 输出: [120,60,40,30,24]

提示:

  • 所有元素乘积之和不会溢出 32 位整数
  • a.length <= 100000

解法一:左右乘积列表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func constructArr(a []int) []int {
    length := len(a)
    if 0 == length {
        return []int{}
    }
    answer := make([]int, length)

    // answer[i] 表示索引 i 左侧所有元素的乘积
    // 因为索引为 '0' 的元素左侧没有元素, 所以 answer[0] = 1
    answer[0] = 1
    for i := 1; i < length; i++ {
        answer[i] = a[i-1] * answer[i-1]
    }

    // R 为右侧所有元素的乘积
    // 刚开始右边没有元素,所以 R = 1
    R := 1
    for i := length - 1; i >= 0; i-- {
        // 对于索引 i,左边的乘积为 answer[i],右边的乘积为 R
        answer[i] = answer[i] * R
        // R 需要包含右边所有的乘积,所以计算下一个结果时需要将当前值乘到 R 上
        R *= a[i]
    }
    return answer
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/07/02 12:53:40
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计