[LeetCode: Rekursion und Backtracking]: 1291. Bestellzeiten

1291. Frequenz meiden

Schwierigkeit: mittel


Wir definieren die "Reihenfolge der Reihenfolge" als: Die Zahl auf jeder Ziffer ist eine ganze Zahl, die 1 größer ist als die Zahl auf der vorherigen Ziffer.
Bitte senden Sie eine geordnete Liste (sortiert vom kleinsten zum größten) zurück, die alle Bestellnummern im Bereich von [niedrig, hoch] enthält.

Beispiel 1:

Ausgabe: niedrig = 100, hoch = 300
Ausgabe: [123,234]
Beispiel 2:

Ausgabe: niedrig = 1000, hoch = 13000
Ausgabe: [1234,2345,3456,4567,5678,6789,12345]

prompt:

10 <= niedrig <= hoch <= 10 ^ 9


Antworten

方法一:穷举
/**
 * @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    
};


Analyse

Aus der Frage geht hervor, dass die Anzahl der Ziffern eine Ziffer größer ist als die vorherige Ziffer. Wenn Sie die Definitionsdomäne erfüllen möchten, können Sie die erschöpfende Methode verwenden, um das Array zu durchlaufen und einzugeben, wenn Sie die Bedingungen erfüllen, da die Die eingegebene Nummer ist nicht von klein bis groß. Ja, daher muss sie am Ende sortiert werden.
Obwohl die erschöpfende Methode einfach ist, ist sie zu zeitaufwändig. Auch hier kann beschnitten werden.

Wenn Sie die Sequenznummer [100,1000] ausgeben möchten, verwenden Sie zuerst toString (). Length, um die Nummer in eine Zeichenfolge zu konvertieren, und ermitteln Sie dann die Länge, dh die Anzahl der Stellen in den Daten, wo erreicht werden kann 100 ist 3-stellig und 1000 ist 4-stellig Nummer, dh i> = 3 && i <= 4.
Es gibt drei Ziffern zwischen 100 und 1000, und die größte Anzahl übereinstimmender Bestellungen ist 789, und es gibt keine nachfolgenden, dh 789 mit der ersten Ziffer von 7 existiert, und die erste 8,9 existiert nicht, also gibt es keine brauche Traverse, damit es beschnitten werden kann, für diese 10-3 (i) = 7.

Ich denke du magst

Origin blog.csdn.net/qq_43522998/article/details/113086846
Empfohlen
Rangfolge