剑指offer—66.构建乘积数组—分析及代码(Java)

剑指offer——66.构建乘积数组——分析及代码[Java]

一、题目

给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)
对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。

二、分析及代码

1. 辅助乘积数组

(1)思路

可将 B 中的元素分解为 A[0] * A[1] * … * A[i-1] 和 A[i+1] * … * A[n-1] 的乘积,而对应不同 i 的 A[0] * A[1] * … * A[i-1] 及 A[i+1] * … * A[n-1] 具有明显规律性,可设计辅助乘积数组 C[i] 和 D[i] 在循环过程中存储对应值,再依次相乘,使时间复杂度降至 O(n)。

(2)代码

import java.util.ArrayList;
public class Solution {
    
    
    public int[] multiply(int[] A) {
    
    
        int [] B = new int[A.length];
        int [] C = new int[A.length];
        int [] D = new int[A.length];
        C[0] = 1;
        D[0] = 1;
        for (int i = 1; i < A.length; i++) {
    
    
            C[i] = C[i - 1] * A[i - 1];
            D[i] = D[i - 1] * A[A.length - i];
        }
        for (int i = 0; i < A.length; i++) {
    
    
            B[i] = C[i] * D[A.length - i - 1];
        }
        return B;
    }
}

(3)结果

运行时间:18 ms,占用内存:9320 k。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/112206760