(Java se refiere a la oferta) Cree una gama de productos

1. Análisis de preguntas

Dada una matriz A[0,1,...,n-1], construir una matriz B[0,1,...,n-1], en el que el elemento B
B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]. No se puede utilizar la división.
(Nota: Provisiones
B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
Para el caso en que la longitud de A sea 1, B no tiene significado y, por lo tanto, no se puede construir, por lo que esta situación no existirá.

La clave del problema es lidiar con la primera, última y media posición., Se deben considerar tres situaciones

Dos, codifica uno

import java.util.Arrays;

/**
 * @Auther: Yolo
 * @Date: 2020/9/9 08:29
 * @Description:
 */
public class Test_09 {
    
    
    public static void main(String[] args) {
    
    
        int[] A = {
    
    1, 2, 3, 4,5};
        int[] B = multiply(A);
        System.out.println(Arrays.toString(B));
    }

    private static int[] multiply(int[] A) {
    
    
        //A 数组不满足题意
        if (A.length <= 1 || A == null) {
    
    
            return null;
        }
        //初始化 b 数组
        int[] b = new int[A.length];
        for (int i = 0; i < A.length; i++) {
    
    
            int temp = 1;
            
            if (i == 0) {
    
    
                //处理 A[0]的情况
                for (int j = 1; j < A.length; j++) {
    
    
                    temp = temp * A[j];
                }
            } else if (i == A.length - 1) {
    
    
                //处理 A[n-1] 的情况
                for (int j = 0; j < A.length - 1; j++) {
    
    
                    temp = temp * A[j];
                }
            } else {
    
    
                //处理其余的情况
                for (int j = 0; j < A.length; j++) {
    
    
                    if (i - 1 >= j || j >= i + 1) {
    
    
                        temp = temp * A[j];
                    }
                }
            }
            b[i] = temp;
        }
        return b;
    }
}

Tres, código dos

El valor de B [i] se puede ver como el producto de cada fila de la matriz de la figura siguiente.

El triángulo inferior se puede obtener fácilmente mediante la multiplicación continua, y el triángulo superior también es una multiplicación continua de abajo hacia arriba.

Entonces, nuestro pensamiento es muy claro, primero calculamos la multiplicación continua en el triángulo inferior, es decir, primero calculamos una parte de B [i], y luego invertimos de acuerdo con la ley de distribución en el triángulo superior, y multiplicamos la otra parte.

Inserte la descripción de la imagen aquí

public class Solution {
    
    
    public int[] multiply(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 j = length-2; j >= 0; j--){
    
    
                temp *= A[j+1];
                B[j] *= temp;
            }
        }
		return B;
    }
}

Cuatro, resumen

Inicialización de matriz: int[] b = new int[A.length];
no puede ser simple y directa int[] b=A;, por lo que ambos apuntan a la misma dirección. Modificar b también hará que A cambie

Supongo que te gusta

Origin blog.csdn.net/nanhuaibeian/article/details/108481474
Recomendado
Clasificación