一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情。
题目描述
给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。
你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。
示例 1:
输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]
示例 2:
输入:n = 2
输出:[1,2]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lexicographical-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天算法题目是一个数字处理题目,题目要求时间复杂度为 O(n) 且使用 O(1) 额外空间的算法,是一个思维题目。
- 首先我们要看懂题目,可以结合示例理解题目,简单描述答案要求就是 1x, 2x, 3x 的结果返回。
- 字典序最小的是1,数值是十进制,因此,我们每次扩大10倍判断是否符合规则。如果 num * 10 <= n, 符合规则,则 num * 10 是下一个字典序数。如果 num mod 10 = 9 或者 num + 1 > n, 说明当前层已经越界,需要处理下一层,即 num = num % 10。实现代码如下:
通过代码
class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> ans = new ArrayList<>();
int num = 1;
for (int i = 0; i < n; i++) {
ans.add(num);
if (num * 10 <= n) {
num *= 10;
} else {
while (num % 10 == 9 || num + 1 > n) {
num /= 10;
}
num++;
}
}
return ans;
}
}
总结
- 上述算法的时间复杂度是O(n),空间复杂度是O(1)。
- 今天这个题目,代码虽然看起来很简单,实现的思路却不好想到。为了更好的掌握这个题目,还是要反复思考,多加练习,才能更好的理解。
- 坚持算法每日一题,加油!