每日算法系列【LeetCode 386】字典序排数
题目描述
给定一个整数 n, 返回从 1 到 n 的字典顺序。
例如,给定 n = 13,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。
请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。
题解
排序法
首先把 1 到 n 所有整数的字符串形式放进数组,然后对这个字符串数组进行排序,最后把所有字符串转换成对应的整数就行了。
时间复杂度是 ,空间复杂度是
。
字典树法
还可以按从小到大顺序直接生成所有整数,首先观察如下的字典树:
可以看出来,这是一棵 10 叉的字典树,第一层根节点,第二层没有 0 (因为不能有前导 0 ),后面的每一层都是在上一层的基础上添加一位 0 到 9 。
而如果按照前序遍历的顺序遍历这棵树,得到的整数序列就是字典序从小到大的。但是这棵树深度是没有限制的啊,所以如果遍历到的数字 x 大于 n 的话,就要结束遍历,回溯到上一层。
时间复杂度是 ,空间复杂度是
。
代码
排序法(c++)
class Solution {public:vector<int> lexicalOrder(int n) {vector<string> s;vector<int> res;for (int i = 1; i <= n; ++i)s.push_back(to_string(i));sort(s.begin(), s.end());for (int i = 0; i < n; ++i) {res.push_back(atoi(s[i].c_str()));}return res;}
};
排序法(python)
class Solution:def lexicalOrder(self, n: int) -> List[int]:res = []for i in range(1, n+1):res.append(str(i))res.sort()res = [int(x) for x in res]return res
字典树法(c++)
class Solution {public:vector<int> lexicalOrder(int n) {vector<int> res;for (int i = 1; i <= 9; ++i)dfs(i, n, res);return res;}void dfs(int x, int n, vector<int>& res) {if (x > n) return;res.push_back(x);for (int i = 0; i <= 9; ++i) {dfs(x*10+i, n, res);}}
};
字典树法(python)
class Solution:def lexicalOrder(self, n: int) -> List[int]:res = []for i in range(1, 10):self.dfs(i, n, res)return resdef dfs(self, x, n, res):if x > n:returnres.append(x)for i in range(10):self.dfs(x*10+i, n, res)
后记
字典序法的递归需要耗费更大的空间,而在实际运行中, python 代码排序法的运行速度甚至比字典序法更快,这说明了 python 递归是真的慢。
每日算法系列【LeetCode 386】字典序排数相关推荐
- LeetCode 386. 字典序排数(DFS循环)
1. 题目 给定一个整数 n, 返回从 1 到 n 的字典顺序. 例如, 给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] . 请尽可能的优化算法的时间复杂度和 ...
- LeetCode Algorithm 386. 字典序排数
386. 字典序排数 Ideas 字典序排序嘛,先生成一个数字数组,然后转成字符串类型,再排一下序,之后再转回整数数组,return就可以了. Code Python from typing impo ...
- Leetcode每日一题386. 字典序排数
- leetcode 386. Lexicographical Numbers | 386. 字典序排数(Java)
题目 https://leetcode.com/problems/lexicographical-numbers/ 题解 思路:先序遍历 10 叉树,参考:Simple Java DFS Soluti ...
- 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符
题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...
- 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...
题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...
- 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...
题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...
- 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和
题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...
- 序列复杂度怎么看_每日算法系列【LeetCode 376】摆动序列
题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...
- 找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列
题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...
最新文章
- python项目部署到docker_使用docker 部署python 项目
- linux 内核参数 rss,Linux控制内存的内核参数
- 【阿里云课程】图像翻译GAN结构与应用
- java Jconsole调优
- 继电器rc吸收电路取值_一文读懂继电器的工作原理以及驱动电路
- Spring Cloud Greenwich 新特性和F升级分享
- 获取登录域帐号信息方式之 —-IIS(VB)
- SpringMVC注解@RequestParam解析
- HDU 4630 No Pain No Game (线段树+离线)
- 斗鱼直播间弹幕爬取2020年最新python
- Pdf之C#直接打印pdf文件
- 软件测试Mysql数据库学习(二)
- ChIPseeker包对ChIP-seq peaks可视化
- C ++程序将字符串的每个单词的首字母转换为大写,将其他转换为小写
- 以javaweb项目为例,用户在搜索网页域名的过程到网页响应到底经过了什么?
- 【Unityc#专题篇】—基础章题单实践
- 企业网络及应用层安全防护技术精要
- python中import string是什么意思_python string是什么
- Bootstrap4 导航active状态切换
- mysql越权漏洞_Fortify漏洞之Access Control: Database(数据越权)(示例代码)