劍指Offer的學習筆記(C#篇)-- 構建乘積數組

題目描述

給定一個數組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]。不能使用除法。

一 . 題目解析

        簡而言之,給你一個數組,返回一個數組,返回的數組內容不包含A[i],注意題目中紅色部分。也就是說,你返回的這個數組B,他的每一項都是數組A中除了A[i]以外內容的乘積。數組

二 . 解題過程

        思想是這樣的:看下圖,B0 = A1*A2*A3*……An-1;(無A0spa

                                                B1 = A0*A2*A3*……An-1;(無A1code

                                                                  ----blog

                                                Bn-1 = A0*A2*A3*……An-2;(無An-1ip

        這個時候呢,看下圖,咱們就把B0至Bn-1都表示出來了;表面上看上去不是很難,可是如何用代碼實現呢,這樣,由於B上的每個元素都是不含B[i]的連乘,若是B中每一個數都等於Bi =(A0*A1*A2*……An-1)/(Ai),是否是很方便呢,but!!題目要求不讓用除法,可是不用除法,這個Ai很差摘出來,因此,這時候,看下圖,把灰色部分當成分界線,再使用連乘,就變成了左右兩部分,而後最後左右再相乘,就實現了咱們的目標,具體看代碼,更加直觀,(我如今在吃包子,以前吃了一個冰激凌,好膩啊!!)it

二 . 代碼實現

class Solution
{
    public int[] multiply(int[] A)
    {
        // write code here
        //定義數組A的長度爲n
        int n = A.Length;
        //定義一個新的數組B
        int [] B = new int [n];
        //設置B[0]爲1
        B[0] = 1 ;
        //建立左循環
        for(int i=1 ; i<n ; i++)
        {
            B[i] = B[i-1]*A[i-1];
        }
        //建立右循環
        int x = 1;
        for(int i = n - 2; i >= 0; i--)
        {
            x = x * A[i+1];
            B[i] *= x;
        }
        //得出新數組B
        return B;
    }
}
相關文章
相關標籤/搜索