力扣 - 劍指 Offer 66. 構建乘積陣列

linzeliang發表於2021-11-04

題目

劍指 Offer 66. 構建乘積陣列

思路1

  • 按照一般的思路就是將所有的相乘,然後除以每一位數字就是答案,但是題目要求我們不能使用除法,因此我們會想到每次遍歷到每個數字的時候,在遍歷一遍陣列,將除開自己以外的數字相乘,但是這樣做的時間複雜度確是\(O(N^2)\),導致超時,因此我們需要想另外一種方法來解決

  • 根據題意,我們可以知道B[i]=A[0]*A[1]*A[2]*...*A[i-1]*A[i+1]*...*A[n-1],所以我們以i為分界線,將這個拆成兩部分,所以B[i]就等於A[0]*...*A[i-1]A[i+1]*...*A[n-1]的乘積,所以陣列B可以看作用一個矩陣來建立。我們以[1, 2, 3, 4]為例,如圖所示:

    image-20211104001359261

    可以看出,對角線是都為1。然後從第二行開始,我們先計算下三角的每一行的乘積:B[i] = B[i-1] * A[i-1]

    從倒數第二行開始,再從下往上計算上結果:B[i] *= A[i+1],因為左邊部分已經計算出來了,所以直接拿來乘就可以了

程式碼

class Solution {
    public int[] constructArr(int[] a) {
        int length = a.length;

        if (length == 0) {
            return new int[0];
        }
        int[] arr = new int[length];

        // 先構建左下三角形
        arr[0] = 1;
        for (int i = 1; i < length; i++) {
            arr[i] = arr[i-1] * a[i-1];
        }
        // 構建右上三角形同時計算結果
        int temp = 1;
        // 從倒數第二個開始往前
        for (int i = length-2; i >= 0; i--) {
            temp *= a[i+1];
            arr[i] *= temp;
        }

        return arr;
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\)
  • 空間複雜度:\(O(1)\)

相關文章