• 构建乘积数组


    题目描述
    给定一个数组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]。不能使用除法。

    方法一
    阶乘即可,但是时间复杂度高.

    	public int[] multiply(int[] A) {
    		int[] b = new int[A.length];
    		if(A == null || A.length == 0) {
    			return b;
    		}
    		
    		for (int i = 0; i < b.length; i++) {
    			b[i] = Factorial(A, 0, i - 1) * Factorial(A, i + 1, b.length - 1);
    		}
    		return b;
    	}
    	
    	public int Factorial(int[] elem, int low, int high) {
    		int temp = 1;
    		for (int i = low; i <= high; i++) {
    			temp *= elem[i];
    		}
    		return temp;
    	}
    

    方法二
    在这里插入图片描述
    下三角用连乘可以很容求得,上三角,从下向上也是连乘。

    定义C[i]=A[0] * A[1] * …* A[n - 1],D[i] = A[i + 1] * A[i + 2] * … * A[n - 1]。
    那么C[i]可以用自上而下的顺序计算出来,即C[i] = C[i - 1] * A[i - 1]。同样D[i]可以自下而上的顺序计算出来,即D[i] = D[i + 1] * A[i + 1]。

    因此思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。

    	public int[] multiply_2(int[] A) {
    		int length = A.length;
    		int[] b = new int[length];
    		if(length != 0) {
    			b[0] = 1;
    			for (int i = 1; i < length; i++) {
    				b[i] = b[i - 1] * A[i - 1];
    			}
    			int temp = 1;
    			for (int i = length - 2; i >= 0; i--) {
    				temp *= A[i + 1];
    				b[i] *= temp;
    			}
    		}
    		return b;
    	}
    
  • 相关阅读:
    php面向对象方法
    php数组中元素的操作
    PHP数组的排序
    [设计模式]抽象工厂模式
    [设计模式]建造者模式
    [设计模式]工厂方法模式
    [设计模式]简单工厂模式
    [设计模式]单例模式
    设计模式系列
    JAVA 设计模式 状态模式
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707655.html
Copyright © 2020-2023  润新知