zoukankan      html  css  js  c++  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]。不能使用除法。

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

    	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;
    	}
    
  • 相关阅读:
    Mysql数据操作指令
    Mysql列属性
    Mysql表的对应关系
    Mysql中的一些类型
    Mysql笔记
    (三) rest_framework 权限与限流源码梳理
    (二) rest_framework 认证源码流程与配置
    (一) rest_framework 视图入口
    django_celery_beat
    GRPC
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707655.html
Copyright © 2011-2022 走看看