[LeetCode:再帰とバックトラッキング]:1291。注文時間

1291.回避頻度

難易度:中


「順序の順序」を次のように定義します。各桁の数値は、前の桁の数値より1大きい整数です。
[低、高]の範囲のすべての注文番号で構成される注文リスト(最小から最大の順に並べ替え)を返送してください。

例1:

出力:低= 100、高= 300
出力:[123,234]
例2:

出力:低= 1000、高= 13000
出力:[1234,2345,3456,4567,5678,6789,12345]

促す:

10 <=低<=高<= 10 ^ 9


回答

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


分析

質問から、桁数が前の桁より1桁多いことがわかります。定義ドメインを満たしたい場合は、条件を満たしていれば、徹底的な方法を使用して配列をトラバースして入力できます。入力した数字は小さいものから大きいものまでありませんはい、最後に並べ替える必要があります。
徹底的な方法は簡単ですが、時間がかかりすぎます。剪定もここで行うことができます。

[100,1000]のシーケンス番号を出力する場合は、最初にtoString()。lengthを使用して数値を文字列に変換してから、長さ、つまりデータの桁数に到達できることを確認します。 100は3桁、1000は4桁の数値、つまりi> = 3 && i <= 4です。
100から1000までの3桁があり、一致する注文の最大数は789であり、後続の注文はありません。つまり、最初の桁が7の789が存在し、最初の8.9が存在しないため、存在しません。この10-3(i)= 7の場合、剪定できるようにトラバースが必要です。

おすすめ

転載: blog.csdn.net/qq_43522998/article/details/113086846