《剑指offer》——构建乘积数组

60 篇文章 3 订阅

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

T:

题目描述
给定一个数组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]。不能使用除法。

刚看到这一题目,直接想到的结题思路就是计算一个总乘积 M M M,然后对于每个 i i i,都有:

B [ i ] = M / A [ i ] B[i] = M/A[i] B[i]=M/A[i]

这是最笨的一种方式,也是最容易实现的一种方式,但是看到题目描述中的最后一句,就断了这个念想。

怎么解决呢?我自己抠了会儿,没想出来,看到本题讨论版上别人的思路描述时,恍然大悟,原来如此~~~

上图:
这里写图片描述

code:

	package niuke.sward2offer.multiplyArray;

	/**
	 * T:构建乘积数组
	 * 
	 * 题目描述
	 * 给定一个数组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]。不能使用除法。
	 * 
	 * date: 2015.11.7  20:15
	 * @author SSS
	 *
	 */
	public class Solution {
	
		/**
		 * 解题思路自己还真没想出来,是看到讨论版上别人贴的解释,才恍然大悟。
		 * 
		 * 对于任意一个i,都有
		 * B[i] = A[0] * A[1] * ... * A[i-1] * A[i+1] * ... * A[n]
		 * 那么,该等式右边,就可以分为2个部分,i之前的为一部分,i之后的为一部分
		 * 所以,有:
		 * before[i] = A[0] * A[1] * ... * A[i-1]
		 * after[i] = A[i+1] * ... * A[n]
		 * 而:
		 * B[i] = before[i] * after[i]
		 * 
		 * before和after各成一个数组,也就是本题的解题思路。
		 * 
		 * @param A
		 * @return
		 */
		public int[] multiply(int []A) {
			int []B = new int[A.length];
			
			// 定义两个数组,分别存储元素i两边的乘积
			int []beforeArray = new int[A.length];
			int []afterArray = new int[A.length];
			
			beforeArray[0] = 1;
			afterArray[A.length - 1] = 1;
			for (int i = 1; i < A.length; i++) {
				beforeArray[i] = A[i - 1] * beforeArray[i - 1];
				afterArray[A.length - 1 - i] = A[A.length - i] * afterArray[A.length - i];
			}
			
			for (int i = 0; i < A.length; i++) {
				B[i] = beforeArray[i] * afterArray[i];
			}
			
			return B;
		}
		
		public static void main(String []args) {
			int []A = {3};
			Solution solution = new Solution();
			
			int []B = solution.multiply(A);
			
			for (int i = 0; i < B.length; i++) {
				System.out.println(B[i]);
			}
		}
	}

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值