打印从1到最大的n位数(DFS+回溯实现)

题目输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]说明:1、用返回一个整数列表来代替打印;2、n 为正整数。思路1、数字的每一位都可以由0 ~ 9的数字组成;(最高位不能为0)2、所以我们可以使用深度优先搜索算法(DFS)来实现数字的构造;3、深度优先搜索(DFS):可理解为朝着某个方向一直递归下去,直到最后一个节点;4、回溯是保
摘要由CSDN通过智能技术生成

题目

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

说明:
1、用返回一个整数列表来代替打印;
2、n 为正整数。

思路

1、数字的每一位都可以由0 ~ 9的数字组成;(最高位不能为0)
2、所以我们可以使用深度优先搜索算法(DFS)来实现数字的构造;
3、深度优先搜索(DFS):可理解为朝着某个方向一直递归下去,直到最后一个节点;
4、回溯是保证StringBuilder保存的数字是正确的,为空时不需要回缩。(比如当n = 2时,如果没有回溯,则StringBuilder保存的是所有数字连接在一起的字符串,则为“12345678910111213…”,而不是单个数字“1,2,3…”)
在这里插入图片描述

注意

1、因为原题返回的结果为int数组,所以这里没有考虑越界的情况,直接保存在List集合中;
2、如果这里需要考虑越界的情况,可以保存在List集合中,然后再进行相应的操作。

实现

class Solution {
   
	// 保存结果的集合
    List<Integer> resultList = new ArrayList<>();
    // 数位可能出现的值
    char[] nums = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,假设你有k个长度为m的数组,你需要从每个数组中各选择一个数,组成一个长度为n的数组,并且这个长度为n的数组中不能有重复的元素。现在我们需要找出所有符合要求的长度为n的不重复的数组合。 这个问题可以使用回溯算法来解决。具体步骤如下: 1. 生成一个空的长度为n的数组,作为结果数组。 2. 从第一个数组中选择一个数,将其放入结果数组中的第一个位置。 3. 从第二个数组中选择一个数,将其放入结果数组中的第二个位置。 4. 依次从第三个、第四个...第k个数组中选择一个数,将其放入结果数组中的第三个、第四个...第k个位置。 5. 检查结果数组中是否有重复元素。如果有重复元素,则回溯到上一个选择的位置重新选择。 6. 如果结果数组中没有重复元素,则将这个数组存入结果集中。 7. 重复步骤2-6,直到遍历完所有的组合。 下面是一个Python的实现代码,可以参考一下: ```python def dfs(arrs, n, path, res): if len(path) == n: res.append(path[:]) return for i in range(len(arrs)): for j in range(len(arrs[i])): if arrs[i][j] in path: continue path.append(arrs[i][j]) dfs(arrs[i+1:], n, path, res) path.pop() def get_combinations(arrs, n): res = [] dfs(arrs, n, [], res) return res ``` 这个算法的时间复杂度为 O(k^m),因为需要遍历所有的组合。当k和m很大时,算法的效率会非常低。在实际应用中,可以考虑使用一些优化方法,例如剪枝、动态规划等来提高算法的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值