每日算法系列【LeetCode 386】字典序排数

简介: 给定一个整数 n, 返回从 1 到 n 的字典顺序。例如,给定 n = 13,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。请尽可能的优化算法的时间复杂度和空间复杂度。输入的数据 n 小于等于 5,000,000。

题目描述


给定一个整数 n, 返回从 1 到 n 的字典顺序。

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

请尽可能的优化算法的时间复杂度和空间复杂度。输入的数据 n 小于等于 5,000,000。

题解


排序法


首先把 1 到 n 所有整数的字符串形式放进数组,然后对这个字符串数组进行排序,最后把所有字符串转换成对应的整数就行了。

时间复杂度是  ,空间复杂度是 。

字典树法


还可以按从小到大顺序直接生成所有整数,首先观察如下的字典树:

image.png字典树

可以看出来,这是一棵 10 叉的字典树,第一层根节点,第二层没有 0 (因为不能有前导 0 ),后面的每一层都是在上一层的基础上添加一位 0 到 9 。

而如果按照前序遍历的顺序遍历这棵树,得到的整数序列就是字典序从小到大的。但是这棵树深度是没有限制的啊,所以如果遍历到的数字 x 大于 n 的话,就要结束遍历,回溯到上一层。

时间复杂度是  ,空间复杂度是 。

代码


排序法(c++)

classSolution {
public:
vector<int>lexicalOrder(intn) {
vector<string>s;
vector<int>res;
for (inti=1; i<=n; ++i)            s.push_back(to_string(i));
sort(s.begin(), s.end());
for (inti=0; i<n; ++i) { 
res.push_back(atoi(s[i].c_str()
                              )
                         );
        } 
returnres;
    }
};

排序法(python)

classSolution: 
deflexicalOrder(self, n: int) ->List[int]:
res= [] 
foriinrange(1, n+1): 
res.append(str(i)
                      )
res.sort() 
res= [int(x) forxinres] 
returnres

字典树法(c++)

classSolution {
public:
vector<int>lexicalOrder(intn) {
vector<int>res;
for (inti=1; i<=9; ++i)
dfs(i, n, res); 
returnres;
    }
voiddfs(intx, intn, vector<int>&res) { 
if (x>n) return; 
res.push_back(x);
for (inti=0; i<=9; ++i) {
dfs(x*10+i, n, res);
        } 
    }
};

字典树法(python)


classSolution: 
deflexicalOrder(self, n: int) ->List[int]:
res= [] 
foriinrange(1, 10):
self.dfs(i, n, res) 
returnresdefdfs(self, x, n, res):
ifx>n:
returnres.append(x)
foriinrange(10):
self.dfs(x*10+i, n, res)

后记


字典序法的递归需要耗费更大的空间,而在实际运行中, python 代码排序法的运行速度甚至比字典序法更快,这说明了 python 递归是真的慢。

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~

相关文章
|
3月前
|
Go
golang力扣leetcode 386.字典序排数
golang力扣leetcode 386.字典序排数
15 0
|
存储 算法
攻克数据结构和算法——第四天:字典
字典有顺序存储,链式存储和散列表示三种存储方式,其中,链式存储又有跳跃链表和树形结构两种方式存储。
64 0
攻克数据结构和算法——第四天:字典
|
存储 前端开发 算法
【戏玩算法】07-字典
在前面的几篇文章中,我们学习了栈、队列、链表以及集合,在这篇文章中学习一个新的数据结构——字典。
57 0
【戏玩算法】07-字典
|
自然语言处理 算法 搜索推荐
[leetcode/lintcode 题解]算法面试真题详解:外星人字典
[leetcode/lintcode 题解]算法面试真题详解:外星人字典
[leetcode/lintcode 题解]算法面试真题详解:外星人字典
|
自然语言处理 算法 BI
算法——bing字典问题
本届大赛由微软必应词典冠名,必应词典(Bing Dictionary)是微软推出的新一代英语学习引擎,里面收录了很多我们常见的单词。但现实生活中,我们也经常能看到一些毫无规则的字符串,导致词典无法正常收录,不过,我们是否可以从无规则的字符串中提取出正规的单词呢? 例如有一个字符串"iinbinbing",截取不同位置的字符‘b’、‘i’、‘n’、‘g’组合成单词"bing"。
877 0
|
30天前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真
|
1月前
|
算法
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
23 2
|
1月前
|
算法
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
39 1
|
3天前
|
机器学习/深度学习 人工智能 算法
基于DCT和扩频的音频水印嵌入提取算法matlab仿真
本文介绍了结合DCT和扩频技术的音频水印算法,用于在不降低音质的情况下嵌入版权信息。在matlab2022a中实现,算法利用DCT进行频域处理,通过扩频增强水印的隐蔽性和抗攻击性。核心程序展示了水印的嵌入与提取过程,包括DCT变换、水印扩频及反变换步骤。该方法有效且专业,未来研究将侧重于提高实用性和安全性。

热门文章

最新文章