代码随想录算法训练营第二十八天| 回溯算法01

77. 组合

对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。

在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。

本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。

题目链接/文章讲解:代码随想录

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

path[:] 在 Python 中表示创建 path 列表的浅拷贝。它的作用是生成一个新的列表,其内容与 path 相同,但它们是不同的对象。

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        result=[]
        self.backtracking(n,k,1,[],result)
        return result

    def backtracking(self,n,k,startIndex,path,result):
        if len(path)==k:
            result.append(path[:])
            return
        for i in range(startIndex,n+1):
            path.append(i)
            self.backtracking(n,k,i+1,path,result)
            path.pop()

216. 组合总和III

如果把 组合问题理解了,本题就容易一些了。

题目链接/文章讲解:代码随想录

视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili

 参照上一题有思路,不需要用双重循环,一个循环即可,条件语句要划清楚

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        result=[]
        self.backtracking(n,k,1,[],result,0)
        return result
    def backtracking(self,n,k,startIndex,path,result,cur_sum):
        if len(path)==k:
            if cur_sum==n:
                result.append(path[:])
            return
        for i in range(startIndex,10):
            if cur_sum+i>n:
                break
            path.append(i)
            self.backtracking(n,k,i+1,path,result,cur_sum+i)
            path.pop()

17. 电话号码的字母组合

本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。

题目链接/文章讲解:代码随想录

视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili

 穷举

class Solution:
    def __init__(self):
        self.letterMap=[
            "",
            "",
            "abc",
            "def",
            "ghi",
            "jkl",
            "mno",
            "pqrs",
            "tuv",
            "wxyz"
        ]
        self.result=[]
    def letterCombinations(self, digits: str) -> List[str]:
        if len(digits)==0:
            return self.result
        self.backtracking(digits,0,"")
        return self.result
    def backtracking(self,digits,index,s):
        if index==len(digits):
            self.result.append(s)
            return
        digit=int(digits[index])
        letters=self.letterMap[digit]
        for letter in letters:
            self.backtracking(digits,index+1,s+letter)

你可能感兴趣的:(算法)