Programación dinámica de entrenamiento de algoritmos elementales LeetCode (conquistando ...)

Introducción

Anterior: LeetCode Elementary Algorithm Training-Sorting and Search

Siguiente: Problema de diseño y entrenamiento del algoritmo elemental LeetCode

Originalmente quería comenzar con el nivel principiante e intermedio y los algoritmos de entrevistas corporativas, pero al final optamos por comenzar desde lo básico, porque no cepillamos preguntas con el propósito de cepillar preguntas, sino ejercitar una especie de algoritmo pensando en el proceso de cepillado de preguntas, después de mucho entrenamiento. Forme una visión única del algoritmo, cultive la sensibilidad al algoritmo, vea el problema, un plan para resolver el problema puede aparecer en el cerebro y, lentamente, genere confianza desde el principio, y esto también es para el complejo algoritmo detrás Sentar las bases para ideas de resolución de problemas.

Introducción al algoritmo primario de LeetCode

Si también quieres entrenar tu propio pensamiento algorítmico, también puedes unirte a mí, comenzando desde el algoritmo elemental, inicia tu viaje del algoritmo: algoritmo elemental .

Un poco de su propio pensamiento: no mire la respuesta después de leer la pregunta y luego recite la pregunta, de modo que la memoria del algoritmo implementado no sea fuerte, debe tener su propio pensamiento; y no escriba sobre IDEA al principio, Asegúrese de intentar escribirlo en la pizarra proporcionada por leetCode y finalmente colóquelo en IDEA para ver si hay algún problema, a fin de consolidar su uso y competencia básica de API; otro punto es ser audaz, no el costo de prueba y error en la entrevista Baja, intenta incorporar nuestras ideas al código.

Debido a problemas de espacio, el blog solo enumera ejemplos y sus propias respuestas de resolución de problemas. Para obtener más detalles, puede hacer clic directamente en el tema para ver.

Subir escaleras

Suponga que está subiendo escaleras. Se necesitan n pasos para llegar a la parte superior del edificio.
Puedes subir 1 o 2 escalones cada vez. ¿De cuántas formas diferentes tienes para subir a la cima de un edificio?

注意:给定 n 是一个正整数。

示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶

示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

La idea de la programación dinámica: solo hay dos situaciones para el último paso de subir escaleras, una es dar un paso, la otra es dar dos pasos, f (x) = f (x-1) + f (x -2), y solo necesitamos saber Con el número de métodos en la primera y segunda capas, podemos calcular la capa n.

Mi primer pensamiento fue la recursividad, pero se agotó el tiempo. Tomó 4.638s cuando n = 45, lo cual fue bastante lento.

class Solution {
    public int climbStairs(int n) {
        if(n == 1) return 1;
        if(n == 2) return 2;
        
        return climbStairs(n - 1) + climbStairs(n - 2);
    }
}

Si la recursividad falla, cambie iterativamente y use un bucle for.

class Solution {
    public int climbStairs(int n) {

        if(n == 1) return 1;
        if(n == 2) return 2;
        
        int stepNMinus1 = 1;
        int stepNMinus2 = 2;

        for(int i = 3 ; i <= n; i++){
            int t = stepNMinus1;
            stepNMinus1 = stepNMinus2;
            stepNMinus2 = t + stepNMinus2;
        }
        return stepNMinus2;
    }
}

45/45 casos de prueba aprobados
Estado: Aprobado Tiempo de
ejecución: 0 ms
Consumo de memoria: 36,6 MB

De hecho, se puede optimizar aún más, utilizando el cálculo de la potencia rápida de la matriz o el cálculo de la fórmula Benets Fomula, pero estos dos implican el cálculo de la matriz y lo componen más tarde.Es demasiado difícil aprender números altos nuevamente.

El mejor momento para comprar y vender acciones.

Dada una matriz, su i-ésimo elemento es el precio de una acción dada en el i-ésimo día.

Si solo puede completar una transacción como máximo (es decir, comprar y vender una acción una vez), diseñe un algoritmo para calcular la ganancia máxima que puede obtener.

Nota: no puede vender acciones antes de comprarlas.

示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
     
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

Solo tenemos que considerar cuánto dinero gané vendiendo hoy. Cuando el precio sea más bajo, actualizaré el valor mínimo de la compra anterior y esperaré hasta el día siguiente para vender. Cada vez comparo con el beneficio máximo del día anterior. Y reemplace el beneficio máximo. El último máximo es el beneficio máximo.

Este es un estado muy ideal para comprar acciones. Para acciones reales, es imposible que nunca vea cuáles desea comprar en el pasado y cuáles no deben comprarse, y ha comprado el punto más bajo de la historia.

class Solution {
    public int maxProfit(int[] prices) {
        if(prices == null || prices.length == 0) return 0;

        int low = prices[0];
        int maxProfit = 0;

        for(int i = 1; i < prices.length; i ++){

            maxProfit = prices[i] - low > maxProfit ? prices[i] - low : maxProfit;

            if(prices[i] < low){
                low = prices[i];
            }
        }
        return maxProfit;
    }
}
Suma máxima de subsecuencia

Dados los números de una matriz entera, busque una submatriz continua con la suma más grande (la submatriz contiene al menos un elemento) y devuelva la suma más grande.

示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

Avanzado:

Si ya ha implementado una solución con complejidad O (n), intente utilizar una solución más sutil de dividir y conquistar.

Supongo que te gusta

Origin blog.csdn.net/u011148116/article/details/107861417
Recomendado
Clasificación