LeetCode-1423. Puntos máximos que puede obtener de Cards-Analysis and Code (Java)

LeetCode-1423. Puntos máximos que puede obtener de las tarjetas [Puntos máximos que puede obtener de las tarjetas] -Análisis y código [Java]

1. Tema

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:

输入:cardPoints = [1,2,3,4,5,6,1], k = 3
输出:12
解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。

Ejemplo 2:

输入:cardPoints = [2,2,2], k = 2
输出:4
解释:无论你拿起哪两张卡牌,可获得的点数总是 4 。

Ejemplo 3:

输入:cardPoints = [9,7,7,9,7,7,9], k = 7
输出:55
解释:你必须拿起所有卡牌,可以获得的点数为所有卡牌的点数之和。

Ejemplo 4:

输入:cardPoints = [1,1000,1], k = 1
输出:1
解释:你无法拿到中间那张卡牌,所以可以获得的最大点数为 1 。 

Ejemplo 5:

输入:cardPoints = [1,79,80,1,1,1,200,1], k = 3
输出:202

inmediato:

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

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos, análisis y código

1. Ventana corredera

(1) Pensando

Debido a que las tarjetas solo se pueden seleccionar de ambos extremos, el intervalo de la longitud de la parte no seleccionada en el medio de len-k se puede diseñar como una ventana deslizante, y el valor máximo de los puntos de tarjeta seleccionados se puede obtener calculando el mínimo valor de la suma del elemento en la ventana.

(2) Código

class Solution {
    
    
    public int maxScore(int[] cardPoints, int k) {
    
    
        int sum = 0, win = 0, len = cardPoints.length, winLen = len - k;
        for (int card : cardPoints)
            sum += card;
        for (int i = 0; i < winLen; i++)
            win += cardPoints[i];
        int winMin = win;
        for (int i = winLen; i < len; i++) {
    
    
            win -= cardPoints[i - winLen];
            win += cardPoints[i];
            winMin = Math.min(winMin, win);
        }
        return sum - winMin;
    }
}

(3) Resultados

Tiempo de ejecución: 2 ms, superando al 95,77% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 47,6 MB, superando al 67,36% de los usuarios en todas las presentaciones de Java.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/113829332
Recomendado
Clasificación