回溯算法 39. 组合总和 52. N皇后II

39. 组合总和

  • 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
    candidates 中的数字可以无限制重复被选取。
    说明:
    所有数字(包括 target)都是正整数。
    解集不能包含重复的组合。

示例:

示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]

示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

思路:回溯算法

使用递归函数完成回溯:
在递归函数中传入候选列表、剩余目标值、当前候选列表索引、临时结果集

  1. 首先判断合法性:即剩余目标值是否小于0
  2. 接着判断是否满足条件:即剩余目标值恰好为0,若满足,则将临时结果集追加到最终结果集中
  3. 通过for循环回溯寻找答案:
    1. 首先向临时结果集中添加一个元素,注意不能直接修改临时结果集,而是重新赋值,防止最终结果集中的temp也发生改变
    2. 调用递归函数
    3. 从递归函数出来时,要么不符合要求,要么已经符合要求并添加当前结果到最终结果集,因此无论怎样,都需要去掉临时结果集中的最后一个元素,并选择下一元素。

代码实现:

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
    
        def helper(candidates, target, start, temp):
            if target < 0:
                return
            if target == 0:
                ret.append(temp)
                return

            for i in range(start, len(candidates)):
                temp = temp + [candidates[i]]
                helper(candidates, target - candidates[i], i, temp)
                temp = temp[:-1]
        ret = []
        helper(candidates, target, 0, [])

        return ret

52. N皇后II

  • n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。在这里插入图片描述
    上图为 8 皇后问题的一种解法。
    给定一个整数 n,返回 n 皇后不同的解决方案的数量。

示例:

输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

思路:回溯算法

代码实现:

class Solution:
    def __init__(self):
        self.count = 0
    def totalNQueens(self, n: int) -> int:
        def check(row, col, columns):
            for r in range(row):
                if columns[r] == col or row - r == abs(columns[r] - col):
                    return False
            return True

        def helper(n, row, columns):
            # 是否所有行都摆放好了皇后
            if n == row:
                self.count += 1
                return
            # 尝试将皇后放置在当前行的每一列
            for col in range(n):
                columns[row] = col
                # 检查是否合法
                if check(row, col, columns):
                    # 如果合法就继续下一行
                    helper(n, row + 1, columns)
                else:
                    # 不合法就不要放在这一列,回溯
                    columns[row] = -1

        helper(n, 0, [0] * n)
        return self.count
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值