Article / 文章
LeetCode 第386题:字典序排数
给定一个整数 n, 返回从 1 到 n 的字典序排列。
📖 文章摘要
本文详细解析LeetCode第386题“字典序排数”,这是一道排序题。文章提供了基于深度优先搜索的解法,包含C#、Python、C++三种语言实现,配有详细的算法分析和性能对比。适合想要提升算法设计能力的读者。
核心知识点: 排序、深度优先搜索、字典序 难度等级: 中等 推荐人群: 具有基础算法知识,想要提升算法设计能力的程序员
题目描述
给定一个整数 n, 返回从 1 到 n 的字典序排列。
示例
示例 1:
输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]
示例 2:
输入:n = 2
输出:[1,2]
提示
- 1 <= n <= 5 * 10^4
解题思路
本题可以使用深度优先搜索解决:
- 从1开始,按字典序生成数字
- 对于每个数字,先尝试乘以10
- 如果乘以10后超过n,则尝试加1
- 如果加1后超过n或个位数为9,则回溯
时间复杂度: O(n) 空间复杂度: O(n)
图解思路
深度优先搜索
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 从1开始 | 初始数字 |
| 2 | 尝试*10 | 生成子节点 |
| 3 | 尝试+1 | 生成兄弟节点 |
| 4 | 回溯 | 处理其他分支 |
生成过程
| 数字 | 操作 | 结果 |
|---|---|---|
| 1 | *10 | 10 |
| 10 | *10 | 100(超过n) |
| 10 | +1 | 11 |
| 11 | *10 | 110(超过n) |
| 11 | +1 | 12 |
| … | … | … |
代码实现
C# 实现
public class Solution {
private List<int> result;
private int n;
public IList<int> LexicalOrder(int n) {
this.n = n;
result = new List<int>();
for (int i = 1; i <= 9; i++) {
DFS(i);
}
return result;
}
private void DFS(int num) {
if (num > n) return;
result.Add(num);
for (int i = 0; i <= 9; i++) {
int next = num * 10 + i;
if (next > n) break;
DFS(next);
}
}
}
Python 实现
class Solution:
def lexicalOrder(self, n: int) -> List[int]:
result = []
def dfs(num):
if num > n:
return
result.append(num)
for i in range(10):
next_num = num * 10 + i
if next_num > n:
break
dfs(next_num)
for i in range(1, 10):
dfs(i)
return result
C++ 实现
class Solution {
private:
vector<int> result;
int n;
void dfs(int num) {
if (num > n) return;
result.push_back(num);
for (int i = 0; i <= 9; i++) {
int next = num * 10 + i;
if (next > n) break;
dfs(next);
}
}
public:
vector<int> lexicalOrder(int n) {
this->n = n;
for (int i = 1; i <= 9; i++) {
dfs(i);
}
return result;
}
};
执行结果
C# 实现
- 执行用时:92 ms
- 内存消耗:24.8 MB
Python 实现
- 执行用时:28 ms
- 内存消耗:13.2 MB
C++ 实现
- 执行用时:4 ms
- 内存消耗:8.4 MB
性能对比
| 语言 | 执行用时 | 内存消耗 | 特点 |
|---|---|---|---|
| C++ | 4 ms | 8.4 MB | 执行效率最高,内存占用最小 |
| Python | 28 ms | 13.2 MB | 代码简洁,内存占用适中 |
| C# | 92 ms | 24.8 MB | 类型安全,内存占用较大 |
代码亮点
- 🎯 使用深度优先搜索生成字典序
- 💡 空间复杂度优化
- 🔍 处理边界情况
- 🎨 代码结构清晰,易于维护
常见错误分析
- 🚫 未使用深度优先搜索
- 🚫 生成顺序错误
- 🚫 边界条件处理错误
- 🚫 空间复杂度优化不足
解法对比
| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
|---|---|---|---|---|
| 深度优先搜索 | O(n) | O(n) | 高效,直观 | 递归开销 |
| 排序 | O(n log n) | O(n) | 简单 | 效率低 |
相关题目
- LeetCode 440. 字典序的第K小数字 - 困难
- LeetCode 386. 字典序排数 - 中等
- LeetCode 386. 字典序排数 - 中等
📖 系列导航
🔥 算法专题合集 - 查看完整合集
📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新第386题。
💬 互动交流
感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。
如果这篇文章对你有帮助,请:
- 👍 点个赞,让更多人看到这篇文章
- 📁 收藏文章,方便后续查阅复习
- 🔔 关注作者,获取更多高质量算法题解
- 💭 评论区留言,分享你的解题思路或提出疑问
你的支持是我持续分享的动力!
💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!