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]
]
思路:回溯算法
使用递归函数完成回溯:
在递归函数中传入候选列表、剩余目标值、当前候选列表索引、临时结果集
- 首先判断合法性:即剩余目标值是否小于0
- 接着判断是否满足条件:即剩余目标值恰好为0,若满足,则将临时结果集追加到最终结果集中
- 通过for循环回溯寻找答案:
- 首先向临时结果集中添加一个元素,注意不能直接修改临时结果集,而是重新赋值,防止最终结果集中的temp也发生改变
- 调用递归函数
- 从递归函数出来时,要么不符合要求,要么已经符合要求并添加当前结果到最终结果集,因此无论怎样,都需要去掉临时结果集中的最后一个元素,并选择下一元素。
代码实现:
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