[LeetCode: Recursion and Backtracking]: 1291. Tiempos de pedido

1291 Frecuencia de shun

Dificultad: media


Definimos el "orden de orden" como: el número en cada dígito es un número entero que es 1 mayor que el número en el dígito anterior.
Devuelva una lista ordenada (ordenada de menor a mayor) que consta de todos los números de pedido en el rango de [bajo, alto].

Ejemplo 1:

Salida: baja = 100, alta = 300
Salida: [123,234]
Ejemplo 2:

Salida: baja = 1000, alta = 13000
Salida: [1234,2345,3456,4567,5678,6789,12345]

rápido:

10 <= bajo <= alto <= 10 ^ 9


responder

方法一:穷举
/**
 * @param {number} shorter
 * @param {number} longer
 * @param {number} k
 * @return {number[]}
 */
var sequentialDigits = function(low, high) {
    
    
let res = [],
        index = 0;
    for (let i = 1; i <= 9; i++) {
    
    
        let n = i;
        for (let j = i + 1; j <= 9; j++) {
    
    
            n = n * 10 + j;
            if (n >= low && n <= high) {
    
    
                res[index++] = n;
            }
        }
    }
    //由于穷举后的数并不是由小到大,所以需要进行排序
    return res.sort(function(a,b){
    
    return a-b;});
};

方法二:剪枝
var sequentialDigits = function(low, high) {
    
    
    let res = []
    let lowLen = low.toString().length
    let highLen = high.toString().length
    for(let i=lowLen;i<=highLen;i++){
    
    
        for(let j=1;j<=10-i;j++){
    
    //剪枝:首位数不会大于10-i
            let str = ''
            let num = j
            str += num
            let k = i-1
            while(k--){
    
    
                num++
                str += num
            }
            let ans = parseInt(str)
            if(ans>=low && ans<=high){
    
    
                res.push(ans)
            }
        }
    }
    return res    
};


análisis

Se puede ver en la pregunta que el número de dígitos es un dígito mayor que el dígito anterior. Si desea cumplir con el dominio de definición, puede usar el método exhaustivo para atravesar e ingresar la matriz si cumple las condiciones, porque el El número ingresado no es de pequeño a grande Sí, por lo que debe ordenarse al final.
Aunque el método exhaustivo es sencillo, lleva demasiado tiempo, aquí también se puede podar.

Si desea generar el número de secuencia de [100,1000], primero use toString (). Length para convertir el número en una cadena y luego encuentre la longitud, es decir, se puede alcanzar el número de dígitos en los datos, donde 100 son 3 dígitos y 1000 son 4 dígitos Número, es decir, i> = 3 && i <= 4.
Hay tres dígitos entre 100-1000, y el mayor número de órdenes coincidentes es 789, y no hay posteriores, es decir, 789 con el primer dígito de 7 existe y el primer 8,9 no existe, por lo que no hay necesita Traverse, por lo que se puede podar, para este 10-3 (i) = 7.

Supongo que te gusta

Origin blog.csdn.net/qq_43522998/article/details/113086846
Recomendado
Clasificación