目录

0386:字典序排数(★)

力扣第 386 题

题目

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。

你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。

示例 1:

输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]

示例 2:

输入:n = 2
输出:[1,2]

提示:

  • 1 <= n <= 5 * 104

分析

#1

观察知道字典排序和字符串排序是一样的,可直接调包。

1
2
3
class Solution:
    def lexicalOrder(self, n: int) -> List[int]:
        return sorted(range(1,n+1), key=str)

48 ms

#2

  • 可以把字符串看作十叉树
  • 字典排序即是树的前序遍历

解答

1
2
3
4
5
6
7
8
    def lexicalOrder(self, n: int) -> List[int]:
        res = []
        sk = [0]
        while sk:
            u = sk.pop()
            res.append(u)
            sk.extend(u*10+i for i in range(9,-1,-1) if 0<u*10+i<=n)
        return res[1:]

129 ms