求职刷题力扣DAY23--回溯算法

1. 77. 组合

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]
代码实现
python 复制代码
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        res = []
        def recur(num, path):
            if len(path) == k:
                res.append(path[:])
                return
            if num > n:
                return
            if len(path) + n - num + 1 < k:
                return
            path.append(num)
            recur(num + 1, path)
            path.pop()
            recur(num + 1, path)
        recur(1, [])
        return res

2. 216. 组合总和 III

找出所有相加之和为 nk 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。
代码实现
python 复制代码
class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        '''
        1. 定义全局变量res储存最终的结果
        2. 定义全局变量path 储存中间的状态
        '''
        res = []
        path = []
        def back_track(start_index: int, sum_value: int):
            if len(path) == k:
                if sum_value == n:
                    res.append(path[:])
                return
            if start_index > 9:
                return 
            for i in range(start_index, 10):
                if len(path) + 10 - i < k:
                    return 
                path.append(i) 
                back_track(i + 1, sum_value + i)
                path.pop()
            return
        back_track(1, 0)
        return res
  

3. [电话号码的字母组合](https://leetcode.cn/problems/combination-sum-iii/)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]
代码实现
python 复制代码
class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        '''
        回溯:
        1. 全局变量res,储存结果,path保存遍历的路径
        2. 回溯递归过程中需要有个start_index
        3. 终止条件判断
        '''
        res = []
        if not digits:
            return res
        path = []
        num_chars_dict = {
            2:"abc",
            3:"def",
            4:"ghi",
            5:"jkl",
            6:"mno",
            7:"pqrs",
            8:"tuv",
            9:"wxyz"
        }
        def back_track(start_index: int):
            if start_index == len(digits):
                res.append("".join(path))
                return
            num = int(digits[start_index])
            for char in num_chars_dict[num]:
                path.append(char)
                back_track(start_index + 1)
                path.pop()
        back_track(0)

        return res
相关推荐
灰灰老师1 小时前
数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)
人工智能·算法·机器学习·数据挖掘·数据分析·kmeans·rapidminer
追求源于热爱!1 小时前
记4(可训练对象+自动求导机制+波士顿房价回归预测
图像处理·人工智能·算法·机器学习·回归
比特在路上2 小时前
蓝桥杯之c++入门(四)【循环】
c++·职场和发展·蓝桥杯
qq_433618442 小时前
哈夫曼树
数据结构·算法
余辉zmh2 小时前
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(二)
c++·算法·leetcode·贪心算法
余辉zmh2 小时前
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)
c++·算法·leetcode·贪心算法
taoyong0013 小时前
代码随想录算法训练营第三十七天-动态规划-完全背包-377. 组合总和 Ⅳ
c++·算法·leetcode·动态规划
励志成为美貌才华为一体的女子3 小时前
python算法和数据结构刷题[4]:查找算法和排序算法
数据结构·算法·排序算法
tt5555555555554 小时前
每日一题-判断是不是完全二叉树
数据结构·算法
君义_noip5 小时前
信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2
算法·动态规划·信息学奥赛·斜率优化