题目概述
- 算法说明
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]*A[1]*…*A[i-1]*A[i+1]*…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1]\ * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)
对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。 - 测试用例
输入:
[1,2,3,4,5]
输出:
[120,60,40,30,24]
解析&参考答案
- 解析
可以把该案例简化为一个n*n的矩阵,斜对角方格的值为1;对脚线左边公式为L(i)={A0,A1*L0,A2*L1,A3*L2,…,An-1*Ln-2},对角线右边为R(j)={An-1,An-2*R1,An-3*R2,A0*Rn-2};
那么: 当i=0,B(0)=1*R(n-2);当i=n-1,B(n-1)=L(n-2)*1;其它条件,B(i)=L(i-1)*R(n-2-i);
因此使用2此循环即可得到数组B,第一次同时获取数组L和R,第二次获取数组B。 - 参考答案
vim jz51.go
package main
import (
"fmt"
)
func Multiply(A []int) []int {
var result []int
lenA := len(A)
arrayL := []int{A[0]}
arrayR := []int{A[lenA-1]}
for i := 1; i < len(A)-1; i++ {
arrayL = append(arrayL, A[i]*arrayL[i-1])
arrayR = append(arrayR, A[lenA-i-1]*arrayR[i-1])
}
//fmt.Println(arrayL)
//fmt.Println(arrayR)
for i := 0; i < lenA; i++ {
if i == 0 {
result = append(result, arrayR[lenA-2])
} else if i == lenA-1 {
result = append(result, arrayL[lenA-2])
} else {
result = append(result, arrayL[i-1]*arrayR[lenA-2-i])
}
}
return result
}
func main() {
array := []int{1, 2, 3, 4, 5}
result := Multiply(array)
fmt.Println(result)
}
注意事项
- to add
说明
- 当前使用 go1.15.8
- 参考 牛客网--剑指offer
标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
注意!!!
- 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
- 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
- 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解