maxScore-el número máximo de puntos disponibles

Título

Varias cartas están dispuestas en una fila, y cada carta tiene un punto correspondiente. El número de puntos viene dado por la matriz de enteros cardPoints.

Para cada acción, puede tomar una carta del principio o del final de la línea, y al final debe tomar exactamente k cartas.

Tus puntos son la suma de los puntos de todas las cartas en tu mano.

Darle una matriz de enteros cardPoints y un entero k, devuelva el número máximo de puntos que puede obtener.

Ejemplo 1:

Entrada: cardPoints = [1,2,3,4,5,6,1], k = 3
Salida: 12
Explicación: En la primera acción, no importa qué carta tome, su punto es siempre 1. Sin embargo, tomar la carta de la derecha primero maximizará sus puntos disponibles. La estrategia óptima es tomar las tres cartas de la derecha, y el punto final es 1 + 6 + 5
= 12.

Ejemplo 2:

Entrada: cardPoints = [2,2,2], k = 2
Salida: 4
Explicación : Independientemente de las dos cartas que recoja, la cantidad de puntos que puede obtener es siempre 4.

Ejemplo 3:

Entrada: cardPoints = [9,7,7,9,7,7,9], k = 7
Salida: 55
Explicación: Debes recoger todas las cartas y los puntos que puedes obtener son la suma de los puntos de todas las cartas.

Ejemplo 4:

Entrada: cardPoints = [1,1000,1], k = 1
Salida: 1
Explicación: No puede obtener la tarjeta en el medio, por lo que el número máximo de puntos que puede obtener es 1.

Ejemplo 5:

Entrada: cardPoints = [1,79,80,1,1,1,200,1], k = 3
Salida: 202

inmediato:

1 <= cardPoints.length <= 10 ^ 5
1 <= cardPoints [i] <= 10 ^ 4
1 <= k <= cardPoints.length

Temas relacionados Ventana deslizante de programación dinámica de matrices

Ideas para resolver problemas

La pregunta sugiere que usar una ventana deslizante puede resolver el problema. La
ventana deslizante no es más que expansión y traslación.
Tome continuamente una tarjeta desde el principio o al final de la línea. Si el valor k es fijo, la posición del resto Las tarjetas nk deben ser continuas y fijas.
Pensamiento inverso, El valor máximo en la pregunta es encontrar el valor mínimo en la ventana (nk)

Demostración de código

class Solution {
    
    
    public int maxScore(int[] cardPoints, int k) {
    
    
       int n=cardPoints.length;
       //记录所有卡牌的和
       int sum=0;
       //记录当前窗口中的值
       int Wnum=0;
       //保留窗口中的最小值
       int min=0;
       //求第一个窗口的值
        for (int i = 0; i < n - k; i++) {
    
    
            sum+=cardPoints[i];
        }
        Wnum=sum;
        min=sum;
        for(int i=n-k;i<n;i++)
        {
    
    
            sum+=cardPoints[i];
            Wnum-=cardPoints[i-n+k];
            Wnum+=cardPoints[i];
            if(Wnum < min)
                min=Wnum;
        }
        return sum-min;
    }
}

resultado de ejecución

La
respuesta de información fue exitosa:
tiempo de ejecución: 2 ms, derrotando al 95.77% de los usuarios de Java
Consumo de memoria: 47.8 MB, derrotando al 35.59% de los usuarios de Java

Supongo que te gusta

Origin blog.csdn.net/tangshuai96/article/details/113716265
Recomendado
Clasificación