「每日LeetCode」2020年10月17日-回溯法三题
本文最后更新于:2023年3月19日 晚上
Lt46. 全排列、77. 组合、17. 电话号码的字母组合
46. 全排列
给定一个** 没有重复** 数字的序列,返回其所有可能的全排列。
示例:
1 |
|
思路
使用回溯法,当临时数组长度等于 k 时,得到了一种排列方式,将 temp 加入结果 res 数组。
每次 dfs 都会从下标 0 开始找起,使用一个 visited 数组判断,求一种排列方式的过程中,数组内的元素的访问状态,在 temp 中有的数据,会被设为 true。下一个 dfs 会跳过 temp 中已有的元素。
dfs 完成后,将 temp 出栈,同时将 visited 设回未访问状态。
解答
1 |
|
77. 组合
给定两个整数 n 和 k_,返回 1 … *n *中所有可能的 _k 个数的组合。
示例:
1 |
|
思路
和全排列方法类似,但是组合不需要从 0 开始找起,之前的元素是已经在当前组合或其他情况组合里的,所以 dfs 可以传入当前元素下标,从当前元素的下一个开始进行组合。
解答
1 |
|
17. 电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
1 |
|
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
思路
两两组合-BFS
本质上是 BFS 实现的回溯,一层一层得到每层可以组合的结果,可以使用队列再优化。写一个两个数组的组合的方法,再将结果和下一个数组进行求组合。先删除字符串中的 1,之后如果没有长度或字符等于 1 返回空数组,其他情况返回对应的 map 里的数组。长度大于 2 的进行组合求解。
DFS
使用一个 x,x 表示使用原字符串的指针下标,其实也可以不使用,直接使用临时数组长度 temp.length 代替 x。使用map[digits[x]]
得到当前指针下标对应 map 里的数组,按顺序选取一个字符插入临时数组中,再进行 dfs 传入 x+1,对下一位进行处理,如果 x 等于 digits 长度则处理完成,将结果添加到 res 中,返回。处理完以后将当前字符出栈,选取下一个字符加入。
解答
两两组合-BFS
1 |
|
DFS
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!