Likou 561. Implementación del lenguaje de IC de matriz dividida: preguntas simples

tema

Portal

Dada una matriz de números enteros con una longitud de 2n, su tarea es dividir estos números en n pares, como (a1, b1), (a2, b2),…, (an, bn) de modo que min (ai, bi ) tienen la mayor suma.
Devuelve la suma máxima.

Ejemplo 1:

Entrada: nums = [1,4,3,2]
Salida: 4
Explicación: Todas las divisiones posibles (ignorando el orden de los elementos) son:

  1. (1, 4), (2, 3) -> min (1, 4) + min (2, 3) = 1 + 2 = 3
  2. (1, 3), (2, 4) -> min (1, 3) + min (2, 4) = 1 + 2 = 3
  3. (1, 2), (3, 4) -> min (1, 2) + min (3, 4) = 1 + 3 = 4
    por lo que la suma máxima es 4

Ejemplo 2:

Entrada: nums = [6,2,6,5,1,2]
Salida: 9
Explicación: El método de división óptimo es (2, 1), (2, 5), (6, 6). Min (2, 1 ) + min (2, 5) + min (6, 6) = 1 + 2 + 6 = 9

inmediato:

1 <= n <= 104
nums.length == 2 * n
-104 <= nums[i] <= 104

Fuente: LeetCode

Resolución de problemas

plantilla

int arrayPairSum(int* nums, int numsSize){
    
    

}

análisis

El tema aquí no es difícil, lo que debemos pensar es cómo podemos obtener el valor máximo para la suma del mínimo de los dos grupos.
El resultado es tan grande y grande como sea posible, de modo que al menos un dato grande ingrese en el cálculo completo final. Cuantos más datos ingrese, mayor será. De hecho, se puede entender que el segundo más grande, el cuarto más grande y los sextos más grandes no se calculan La suma grande de elementos, es decir, la suma de los elementos clasificados por tamaño se calcula tomando un número par. En este caso, podemos elegir una nueva solución, ordenar y agregar elementos pares para obtener la respuesta final.
Método de implementación de la primera edición:

int arrayPairSum(int* nums, int numsSize){
    
    
    int x=0,ret=0;
    for(int i=0;i<numsSize;i++){
    
    
        for(int k=i;k<numsSize;k++){
    
    
            if(nums[i]<nums[k]){
    
    
                x=nums[i];
                nums[i]=nums[k];
                nums[k]=x;
            }
        }
    }
    for(int i=0;i<numsSize;i+=2){
    
    
        ret+=nums[i];
    }
    return ret;
}

¿Hay algún problema con este código? No, pero tiene una deficiencia, la complejidad hace que todo el programa se ejecute y la comparación de múltiples matrices de variables se agote

Inserte la descripción de la imagen aquí

Para resolver este problema, puede utilizar la función de clasificación de matrices incorporada qsort () en el lenguaje C.
No se escribe ningún uso específico aquí, pero se muestra un esquema general.

int compare(const void* a, const void* b) {
    
    
    return (*(int*)a)-(*(int*)b);//从小到大
    //return *(int *)b-*(int *)a;//从大到小
}

void func(int* nums, int numsSize) {
    
    
    qsort(nums,numsSize,sizeof(int),compare);
}

Este es el caso del código que sigue a la fusión y la colocación.

int cmp(int *a, int *b) {
    
    
    return *a - *b;
}

int arrayPairSum(int *nums, int numsSize) {
    
    
    qsort(nums, numsSize, sizeof(int), cmp);
    int ret = 0;
    for (int i = 0; i < numsSize; i += 2) {
    
    
        ret += nums[i];
    }
    return ret;
}

Inserte la descripción de la imagen aquí

Siempre es útil usar la lógica de función existente para codificar en el lenguaje C. En el futuro, agregaré las notas de las funciones principales de C en las notas del lenguaje C.

Supongo que te gusta

Origin blog.csdn.net/qq_44922487/article/details/113821753
Recomendado
Clasificación