386. 字典序排數(shù)(Python)

題目

難度:★★★☆☆
類(lèi)型:數(shù)組
方法:深度優(yōu)先搜索

傳送門(mén)

給定一個(gè)整數(shù) n, 返回從 1 到 n 的字典順序。

例如,

給定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。

請(qǐng)盡可能的優(yōu)化算法的時(shí)間復(fù)雜度和空間復(fù)雜度。 輸入的數(shù)據(jù) n 小于等于 5,000,000。

解答

從解決問(wèn)題的角度來(lái)說(shuō),python很友好:

class Solution:
    def lexicalOrder(self, n):
        return sorted(range(1, n+1), key=str)

但是從學(xué)習(xí)的角度來(lái)說(shuō),我們用深度優(yōu)先搜索來(lái)做:

我們從1位數(shù)開(kāi)始,位數(shù)逐漸增加,用深度優(yōu)先搜索遍歷所有的情況:
1位數(shù):0到9;
2位數(shù):10到99:;
3位數(shù):100到999;
...

定義結(jié)果列表,用于按題目要求順序添加整數(shù),定義深度優(yōu)先搜索函數(shù),函數(shù)輸入為10的倍數(shù),在入口處設(shè)置判斷,排除已經(jīng)超過(guò)給定值的情況,然后將該數(shù)乘以10,研究以該數(shù)為十位數(shù)的所有數(shù)字。通過(guò)遞歸調(diào)用實(shí)現(xiàn)所有數(shù)字的添加。

class Solution:
    def lexicalOrder(self, n):
        res = []

        def dfs(cur):
            if cur > n:
                return
            else:
                res.append(cur)
                for i in range(10):
                    if 10 * cur + i > n:
                        return
                    dfs(10 * cur + i)

        for i in range(1, 10):
            dfs(i)

        return res

如有疑問(wèn)或建議,歡迎評(píng)論區(qū)留言~

有關(guān)更多力扣中等題的python解決方案,請(qǐng)移步力扣中等題解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容