更多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),也可扫下方二维码关注获取最新文章哦~