剑指offer第二版——面试题66(java)

本文介绍了一种在不使用除法的情况下,构建一个数组B,其中B[i]等于原数组A中除了A[i]外所有元素的乘积的算法。通过预计算前缀和后缀乘积,实现了O(n)时间复杂度的高效解决方案。

面试题:构建乘积数组

题目:

给定一个数组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]

不能使用除法

思路:

一、暴力解法的时间复杂度为O(n²)

二、

B[i] = A[0]×A[1]×……×A[i-1]×A[i+1]×……×A[n-1]可分为 A[0]×A[1]×……×A[i-1]和A[i+1]×……×A[n-1]两个部分的乘积

即B[i] = 【A[0]×A[1]×……×A[i-1]】 × 【A[i+1]×……×A[n-1]】

设C[i] = A[0]×A[1]×……×A[i-1]、D[i] = A[i+1]×……×A[n-1]

可知C和D可自下而上计算,避免了重复的计算——C[i] = C[i-1]×A[i-1]   D[i] = D[i+1]×A[i+1]

分别存储C和D,在计算B时,只需要将对应的C和D相乘

代码:

public class Q66 {
	public static void main(String[] args) {
		int[] A = new int[] {1,2,3,4,5};
		int[] B = multipy(A);
		
		if(B!=null) {
			for(int i=0;i<B.length;i++) {
				System.out.println(B[i]);
			}
		}
	}
	
	public static int[] multipy(int[] A) {
		if(A.length!=0) {
			int[] B = new int[A.length];
			int[] C = new int[A.length];
			int[] D = new int[A.length];
			
			C[0] = 1;
			for(int i=1;i<A.length;i++) {
				C[i] = C[i-1]*A[i-1];
			}
			
			D[A.length-1] = 1;
			for(int i=A.length-2;i>=0;i--) {
				D[i] = D[i+1] * A[i+1];
			}
			
			for(int i=0;i<A.length;i++) {
				B[i] = C[i] * D[i];
			}
			return B;	
		}else {
			return null;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值