LeetCode之回溯

本文深入探讨了回溯算法在解决组合问题中的应用,包括如何找到给定范围内的所有k个数的组合,以及如何通过剪枝优化搜索过程。同时,还展示了如何使用回溯算法求解全排列问题,确保每个数字最多使用一次。这些实例详细解析了回溯算法的基本格式和关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回溯的一般格式

path = [ ]
res = [ ]
def backtracking(param) {
    if (end condition):
        save result
        return
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点
        backtracking(路径,选择列表)
        回溯,撤销处理结果
    }
}

组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        res = []
        path = []

        def func(n:int, k:int, startIndex:int):
            if len(path) == k:
                res.append(path[:])
                return

            for i in range(startIndex, n+1):
                path.append(i)
                func(n, k, i+1)
                path.pop()

        func(n,k,1)
        return res  

剪枝
已经选择的元素个数:path.size();
还需要的元素个数为: k - path.size();
在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        tmp ,res = [], []
        
        def func(StartIndex, n ,k):
            if len(tmp) == k:
                res.append(tmp[:])
                return     
                       
            for i in range(StartIndex, n-(k-len(tmp))+2):  # 优化的地方
                tmp.append(i)
                func(i+1, n, k)
                tmp.pop()
                
        func(1,n,k)        
        return res

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字 1 到 9
每个数字 最多使用一次

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:

        def backtracking(start, sum_now):
            if sum_now > n:
                return
            if len(path) == k and sum_now == n:		# key_point
                res.append(path[:])
                return
            for i in range(start, 9-(k-len(path))+2):	# key_point
                path.append(i)
                sum_now += i		# key_point
                backtracking(i+1, sum_now)
                sum_now -= i		# key_point			
                path.pop()
            
        res, path = [], []
        backtracking(1,0)
        return res

全排列

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res = []
        
        def backtrack(nums, tmp):
            if not nums:
                res.append(tmp)
                return
            for i in range(len(nums)):
                backtrack(nums[:i]+nums[i+1:], tmp+[nums[i]])
        
        backtrack(nums, [])
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值