Solución de problema codicioso (1)

Tabla de contenido

Suma máxima de K elementos

tren de pensamiento

el código

 El valor mínimo de la suma del par más grande en una matriz

explicar

el código

Suma máxima de K elementos

Se le proporciona una   matriz de números enteros  indexados desde 0nums  y un número entero  k . Debe hacer lo siguiente  exactamente k  veces para maximizar su puntaje:

  1. nums Seleccione un elemento de él  m .
  2. Elimina los elementos seleccionados  m de la matriz.
  3. Agregue nuevos elementos  m + 1 a la matriz.
  4. Tu puntuación aumenta  m .

Devuelva  k la puntuación máxima después de realizar las operaciones anteriores exactamente veces.

Ejemplo 1:

Entrada: nums = [1,2,3,4,5], k = 3
 Salida: 18
 Explicación: Necesitamos seleccionar exactamente 3 elementos de nums y maximizar la puntuación. 
Seleccione 5 por primera vez. La suma es 5, nums = [1,2,3,4,6]. 
Seleccione 6 por segunda vez. La suma es 6, nums = [1,2,3,4,7]. 
Elige 7 por tercera vez. La suma es 5 + 6 + 7 = 18, nums = [1,2,3,4,8]. 
Así que devolvemos 18. 
18 es la mayor respuesta que se puede obtener.

Ejemplo 2:

Entrada: nums = [5,5,5], k = 2
 Salida: 11
 Explicación: Necesitamos seleccionar exactamente 2 elementos de nums y maximizar la puntuación. 
Seleccione 5 por primera vez. La suma es 5, nums = [5,5,6]. 
Seleccione 6 por segunda vez. La suma es 6, nums = [5,5,7]. 
Así que devolvemos 11. 
11 es la máxima respuesta que se puede obtener.

pista:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100
  • 1 <= k <= 100

tren de pensamiento

Siento que es demasiado esotérico.

De hecho, es muy simple, le da una matriz, es posible que no esté ordenada.

Entonces, tienes que ordenar, por supuesto, no necesitas ordenar, después de todo, es solo una pregunta simple.

Situación 1: no alinee
el bucle for directo de una sola capa, encuentre el más grande y no necesite ninguna matriz, solo acumule directamente, agregue 1 al máximo cada vez que agregue el máximo a la suma y realice tales operaciones tantas veces como k es , y finalmente devuelve sum. La complejidad temporal del caso 1 es O(n).

Caso 2:
Después de clasificar, ¿no es el más grande? Luego le das el mayor (suma) en la matriz ordenada, y luego lo eliminas o no, no lo escuches, solo agrega 1 al mayor original, por lo que sigue siendo el mayor. Sea lo que sea k, puedes tomarlo tantas veces como quieras, y luego agregar 1 y devolverlo. La complejidad temporal del caso 2 es O(nlogn).

el código

import java.util.Arrays;

public class k个元素的最大和 {
    public static void main(String[] args) {
        int k=3;
        int nums[]={1,2,3,4,5};
        k个元素的最大和 kg = new k个元素的最大和();
        System.out.println(kg.maximizeSum(nums,k));
    }
    public int maximizeSum(int nums[],int k){
        int sum=0;
        //排序版:
//        Arrays.sort(nums);
//        for (int i = 0; i < k; i++) {
//            sum+=nums[nums.length-1];
//            nums[nums.length-1]+=1;
//        }
        //未排序版:
        int max=Returnmax(nums);
        for (int i = 0; i < k; i++) {
            sum+=max;
            max+=1;
        }
        return sum;
    }
    //找最大
    public int Returnmax(int nums[]){
        int max=nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (max<nums[i]){
                max=nums[i];
            }
        }
        return max;
    }
}

 El valor mínimo de la suma del par más grande en una matriz

La suma(a,b) de pares  de  un par   es igual a   . La suma de pares más grande  es la  suma de pares más grande en una matriz de pares  .a + b

  • Por ejemplo, si tenemos pares  (1,5) , (2,3) y  (4,4), la suma del par más grande  es  max(1+5, 2+3, 4+4) = max(6, 5, 8) = 8 .

Dada una   matriz de  longitud uniforme   ,   divida los elementos   en pares de manera que:nnumsnumsn / 2

  • nums Cada elemento de   está en  exactamente un  par, y
  • La suma del par más grande tiene el  valor  más pequeño  .

Devuelva la suma de pares de números más pequeña y más grande según el esquema de división de pares de números óptimo   .

Ejemplo 1:

Entrada: nums = [3,5,2,3]
 Salida: 7
 Explicación: Los elementos de la matriz se pueden dividir en pares (3,3) y (5,2). 
La suma máxima del par es max(3+3, 5+2) = max(6, 7) = 7.

Ejemplo 2:

Entrada: nums = [3,5,4,2,4,6]
 Salida: 8
 Explicación: Los elementos de la matriz se pueden dividir en pares (3,5), (4,4) y (6,2). 
La suma máxima del par es max(3+5, 4+4, 6+2) = max(8, 8, 8) = 8 .

pista:

  • n == nums.length
  • 2 <= n <= 105
  • n es  un número par  .
  • 1 <= nums[i] <= 105

explicar

La dificultad de esta pregunta es media, pero no creo que lo sea, puede ser que la codicia sea relativamente simple.

En primer lugar, sabemos que la longitud de la matriz nums[] es par, lo que ahorra un juicio.

En segundo lugar, podemos saber a partir de los ejemplos que existe una regla de que la combinación de pares es relativa entre sí. ¿Por qué dices eso? Si ordena la matriz del ejemplo, encontrará que cada vez que se toma el número de grupos, es el más grande y el más pequeño, el segundo más grande y el segundo más pequeño, y así sucesivamente.

Por lo tanto, uso punteros dobles, comenzando desde el principio y el final respectivamente, y no hay necesidad de juzgar. Cada vez que los dos punteros dan un paso, la complejidad de tiempo de for es solo O(n/2),

Pero la complejidad de tiempo general de mi algoritmo es O(nlogn), y las dos ordenaciones rápidas son grandes. De hecho, la segunda matriz que almacena la suma máxima de pares de números no necesita ordenarse rápidamente, basta con escribir directamente la relación de un solo ciclo y, finalmente, volver a max.

el código

import java.util.Arrays;

public class 数组中最大数对和的最小值 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
//        int nums[] = {3,5,2,3};
        int nums[] = {3,5,4,2,4,6};
        数组中最大数对和的最小值 s = new 数组中最大数对和的最小值();
        System.out.println(s.minPairSum(nums));
//        System.out.println(nums.length);
    }

    public int minPairSum(int[] nums) {
        int max = 0, j = nums.length - 1;
        Arrays.sort(nums);
        int temp[] = new int[nums.length / 2];
        for (int i = 0; i < nums.length / 2; i++) {
            temp[i] = nums[i] + nums[j--];
//            j++;
        }
        Arrays.sort(temp);
        max = temp[temp.length - 1];
        return max;
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_64206989/article/details/131314986
Recomendado
Clasificación