数组14--构建乘积数组

数组14--构建乘积数组-jz51

题目概述

  • 算法说明
    给定一个数组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)
}

注意事项

  1. to add

说明

  1. 当前使用 go1.15.8
  2. 参考 牛客网--剑指offer
    标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。

注意!!!

  • 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
  • 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
  • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值