求职刷题力扣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 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki1 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
qqxhb3 小时前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
FirstFrost --sy5 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
森焱森5 小时前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
搂鱼1145145 小时前
(倍增)洛谷 P1613 跑路/P4155 国旗计划
算法
Yingye Zhu(HPXXZYY)5 小时前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法
独行soc5 小时前
2025年渗透测试面试题总结-2025年HW(护网面试) 33(题目+回答)
linux·科技·安全·网络安全·面试·职场和发展·护网
无聊的小坏坏6 小时前
三种方法详解最长回文子串问题
c++·算法·回文串
长路 ㅤ   7 小时前
Java后端技术博客汇总文档
分布式·算法·技术分享·编程学习·java后端