LeetCode_DFS_中等_386.字典序排数

x33g5p2x  于2022-08-17 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(371)

1.题目

给你一个整数 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]

提示:
1 <= n <= 5 * 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lexicographical-numbers

2.思路

(1)字符串转换
如果不考虑时间复杂度和空间复杂度,可以先将 [1, n] 内整数转换为对应的字符串并存储到数组 strNum 中,然后再对 strNum 中的元素进行排序,最后再将其结果保存到 res 中并返回即可。该方法时间复杂度和空间复杂度分别为 O(nlogn) 和 O(n)。

(2)深度优先搜索
思路参考本题官方题解

3.代码实现(Java)

  1. //思路1————字符串转换
  2. class Solution {
  3. public List<Integer> lexicalOrder(int n) {
  4. List<Integer> res = new ArrayList<>();
  5. //将 [1, n] 内整数转换为对应的字符串
  6. String[] strNum = new String[n];
  7. for (int i = 0; i < n; i++) {
  8. strNum[i] = String.valueOf(i + 1);
  9. }
  10. Arrays.sort(strNum);
  11. for (int i = 0; i < n; i++) {
  12. res.add(Integer.parseInt(strNum[i]));
  13. }
  14. return res;
  15. }
  16. }
  1. //思路2————深度优先搜索
  2. class Solution {
  3. public List<Integer> lexicalOrder(int n) {
  4. List<Integer> res = new ArrayList<>();
  5. int num = 1;
  6. for (int i = 0; i < n; i++) {
  7. res.add(num);
  8. if (num * 10 <= n) {
  9. num *= 10;
  10. } else {
  11. while (num % 10 == 9 || num + 1 > n) {
  12. num /= 10;
  13. }
  14. num++;
  15. }
  16. }
  17. return res;
  18. }
  19. }

相关文章