Algoritmo: el producto máximo de tres números (problema de TopK con K pequeño)

1. El producto máximo de tres números

Esta pregunta proviene de: 628. El producto máximo de tres números

La dificultad es fácil.

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

输入: [1,2,3]
输出: 6
示例 2:

输入: [1,2,3,4]
输出: 24
注意:

给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。

El problema es fácil de entender. Es encontrar el valor máximo del producto de tres números en la matriz. Encontramos el producto de los dos números más pequeños y el dígito más grande. En comparación con el producto de tres dígitos más grande, seleccione el elemento más grande.

Entonces, el problema se convierte en el problema de elegir TopK. Por supuesto, podemos usar un montón para resolver este problema. Construya un montón mínimo con una capacidad de 2 y un montón máximo con una capacidad de 3 (ambos montones superiores pequeños) para resolver este problema. Sin embargo, dado que el número de elementos a seleccionar es muy pequeño, usar estructuras de datos avanzadas es un poco complicado.

Entonces podemos encontrar manualmente los elementos más grandes y más pequeños.

    public int maximumProduct(int[] nums) {
    
    
        int min1=Integer.MAX_VALUE,min2=Integer.MAX_VALUE;
        int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
        for(int n:nums){
    
    
            if(n<=min1){
    
    
                min2=min1;
                min1=n;
            }else if(n<=min2){
    
    
                min2=n;
            }
            if(n>=max1){
    
    
                max3=max2;
                max2=max1;
                max1=n;
            }else if(n>=max2){
    
    
                max3=max2;
                max2=n;
            }else if(n>max3){
    
    
                max3=n;
            }
        }
        return Math.max(min1*min2*max1,max1*max2*max3);
    }

2. Encuentra los tres números más grandes

Cuando esta pregunta es un byte de cara, se da una pregunta. Las soluciones convencionales incluyen el método de pila y el método de selección rápida. La desventaja es que el método de escritura es complicado (de hecho, no es complicado ...). La solución que di fue similar a la solución a continuación.

    //求最大的3个元素
    public int[] top3(int[] nums){
    
    
        int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
        for(int n:nums){
    
    
            if(n>=max1){
    
    
                max3=max2;
                max2=max1;
                max1=n;
            }else if(n>=max2){
    
    
                max3=max2;
                max2=n;
            }else if(n>max3){
    
    
                max3=n;
            }
        }
        int[] result={
    
    max3,max2,max1};
        return result;
    }

Supongo que te gusta

Origin blog.csdn.net/qq_23594799/article/details/105938721
Recomendado
Clasificación