题目描述

给定一个整数 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】字典序排数相关推荐

  1. LeetCode 386. 字典序排数(DFS循环)

    1. 题目 给定一个整数 n, 返回从 1 到 n 的字典顺序. 例如, 给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] . 请尽可能的优化算法的时间复杂度和 ...

  2. LeetCode Algorithm 386. 字典序排数

    386. 字典序排数 Ideas 字典序排序嘛,先生成一个数字数组,然后转成字符串类型,再排一下序,之后再转回整数数组,return就可以了. Code Python from typing impo ...

  3. Leetcode每日一题386. 字典序排数

  4. leetcode 386. Lexicographical Numbers | 386. 字典序排数(Java)

    题目 https://leetcode.com/problems/lexicographical-numbers/ 题解 思路:先序遍历 10 叉树,参考:Simple Java DFS Soluti ...

  5. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  6. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  7. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...

    题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...

  8. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  9. 序列复杂度怎么看_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

  10. 找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

最新文章

  1. python项目部署到docker_使用docker 部署python 项目
  2. linux 内核参数 rss,Linux控制内存的内核参数
  3. 【阿里云课程】图像翻译GAN结构与应用
  4. java Jconsole调优
  5. 继电器rc吸收电路取值_一文读懂继电器的工作原理以及驱动电路
  6. Spring Cloud Greenwich 新特性和F升级分享
  7. 获取登录域帐号信息方式之 —-IIS(VB)
  8. SpringMVC注解@RequestParam解析
  9. HDU 4630 No Pain No Game (线段树+离线)
  10. 斗鱼直播间弹幕爬取2020年最新python
  11. Pdf之C#直接打印pdf文件
  12. 软件测试Mysql数据库学习(二)
  13. ChIPseeker包对ChIP-seq peaks可视化
  14. C ++程序将字符串的每个单词的首字母转换为大写,将其他转换为小写
  15. 以javaweb项目为例,用户在搜索网页域名的过程到网页响应到底经过了什么?
  16. 【Unityc#专题篇】—基础章题单实践
  17. 企业网络及应用层安全防护技术精要
  18. python中import string是什么意思_python string是什么
  19. Bootstrap4 导航active状态切换
  20. mysql越权漏洞_Fortify漏洞之Access Control: Database(数据越权)(示例代码)

热门文章

  1. php扩展php_curl windows 安装问题
  2. poj 3928 树状数组
  3. win32汇编-窗口 对话框 (三)
  4. C/C++ 活动预处理器
  5. 在Linux上配置xampp后远程访问域名报错
  6. eclipse引入jar类包的源代码
  7. android - startActivity浅谈
  8. 为tomcat分配内存
  9. mysql 5.7 无法启动 服务没有报告任何错误
  10. jquery 使用下拉效果的实现