386. 字典序排数
题目来源:386. 字典序排数
2022.04.18 每日一题
LeetCode 题解持续更新中GitHub仓库地址 CSDN博客地址
今天的题目很容易理解,给定一个数字 n ,将 [1,n]
按照字典序进行排序
暴力
第一个方法就是暴力法,将每个数字转成字符串,然后进行字典序排序,再转换成为数字进行输出
bool cmp(int a, int b) {
return strcmp(to_string(a).c_str(), to_string(b).c_str()) < 0;
}
class Solution {
public:
vector<int> lexicalOrder(int n) {
// 创建一个列表用于存储数字
vector<int> list;
// 将数字依次放入数组中
for (int i = 1; i <= n; i++) list.push_back(i);
// 将数组按照字典序进行排序
sort(list.begin(), list.end(), cmp);
// 返回结果
return list;
}
};
class Solution {
public List<Integer> lexicalOrder(int n) {
// 创建一个列表用于存储数字
List<Integer> list = new ArrayList<>();
// 将数字依次放入数组中
for (int i = 1; i <= n; i++) list.add(i);
// 将数组按照字典序进行排序
list.sort((i1, i2) -> String.valueOf(i1).compareTo(String.valueOf(i2)));
// 返回结果
return list;
}
}
DFS
上面那种方法简单而粗暴,但是运行起来的效率就不是很好
那么,我们有没有什么优化的措施呢?
我们举一个例子:
如果输入数字 13
,我们可以得到如下结果[1,10,11,12,13,2,3,4,5,6,7,8,9]
我们发现字典序的排序是根据首位不一样的字符的大小进行排序的
那么我们可以知道 一个数字num
字典序的下一位整数 就是 num*10
,我们可以在这个整数的基础上进行 加一 操作,与最初给的数字 n
进行比较,如果大于了,就退出,反之就继续进行下去。
class Solution {
public :
// 创建一个变量 n 记录数据范围
int n;
// 创建一个 数组统计 结果
vector<int> res;
vector<int> lexicalOrder(int _n) {
n = _n;
// 从 1 开始进行递归
for (int i = 1; i <= 9; i++) {
// 如果 当前的 i 的值大于 _n 就跳出循环
if (_n < i) break;
// 反之在数组中加入对应的值
res.push_back(i);
// 对这个值进行下一步的递归
dfs(i);
}
// 最后返回最后的结果
return res;
}
void dfs(int i) {
// 对传入的数字进行 递归操作
int temp = i;
// 在其身后一次添加 0~9 的数字
for (int j = 0; j <= 9; j++) {
int t = temp * 10 + j;
// 如果大于了当前的数字,就说明当前数字过大了,应当停止
if (t > n) return;
// 如果没有,就在数组中添加相应的值
res.push_back(t);
// 对当前的值,进行下一步的递归
dfs(t);
}
}
};
class Solution {
// 创建一个变量 n 记录数据范围
public int n;
// 创建一个 数组统计 结果
public List<Integer> res = new ArrayList<>();
public List<Integer> lexicalOrder(int _n) {
n = _n;
// 从 1 开始进行递归
for (int i = 1; i <= 9; i++) {
// 如果 当前的 i 的值大于 _n 就跳出循环
if (_n < i) break;
// 反之在数组中加入对应的值
res.add(i);
// 对这个值进行下一步的递归
dfs(i);
}
// 最后返回最后的结果
return res;
}
public void dfs(int i) {
// 对传入的数字进行 递归操作
int temp = i;
// 在其身后一次添加 0~9 的数字
for (int j = 0; j <= 9; j++) {
int t = temp * 10 + j;
// 如果大于了当前的数字,就说明当前数字过大了,应当停止
if (t > n) return;
// 如果没有,就在数组中添加相应的值
res.add(t);
// 对当前的值,进行下一步的递归
dfs(t);
}
}
}