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

来源:互联网 发布:认识数据库管理 编辑:程序博客网 时间:2024/06/12 01:20

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,然后对于每个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]);            }        }    }
0 0