剑指 Offer 66. 构建乘积数组

该问题要求构建一个新的数组B,其中B[i]是数组A中除去A[i]的所有元素的乘积。解决方案是通过遍历数组,分别计算下三角和上三角的乘积,避免使用除法。提供的Java代码实现这一算法,初始化B[0]=1,然后依次计算下三角和上三角元素的乘积,最终得到B数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给定一个数组 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]。不能使用除法。
在这里插入图片描述

思路

本题难点在于不能使用除法,即只用乘法 生成数组B

数组B的定义是,B[i]的值为数组A中除了A[i]之外所有元素的乘积值

在这里插入图片描述

根据表格的主对角线(全为 1 ),可将表格分为 上三角下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可 不使用除法 就获得结果。

算法流程

(1)初始化:数组 B ,其中 B[0]=1;辅助变量 tmp=1
(2)计算 B[i]的 下三角 各元素的乘积,直接乘入 B[i]
(3)计算 B[i]的 上三角 各元素的乘积,记为 tmp,并乘入 B[i]
(4)返回 B

流程图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

java代码如下:

class Solution{
	public int[] constructArr(int[] a){
		int len = a.length;
		if (len == 0) {
			return new int[0];
		}
		int[] b = new int[len];
		b[0] = 1;
		int tmp = 1;
		for(int  i = 1; i < len; i++){
			b[i] = b[i-1] * a[i-1];//从第一行到最后一行逐行计算下三角每行的b[i]的值,此时的b[i]值是不完全的值,因为还没有和上三角的值相乘
		}
		for(int i = len - 2; i >= 0; i--){//注意起始索引为len-2,在图中可以看出
			tmp *= a[i+1];//从下往上计算每行的乘积值并存储下来
			b[i] *= tmp;//将存储的值和前面计算的下三角的每行的b[i]值相乘
		}
		return b;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HDU-五七小卡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值