457 字
2 分钟
代码随想录算法训练营第二十天 | 回溯算法 Part02
组合总和问题
组合总和是回溯算法的经典应用,目标是在给定的数字集合中找出所有和为目标值的组合。
核心考点包括:
- 是否允许重复使用数字。
- 是否存在数组中有重复元素。
- 如何剪枝优化搜索。
39. 组合总和
class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: self.path = [] # 当前组合路径 self.res = [] # 所有合法组合 self.sum = 0 # 当前组合的总和 candidates.sort() # 排序用于剪枝 self.backtrack(candidates, target, 0) return self.res
def backtrack(self, candidates, target, start): if self.sum == target: self.res.append(self.path[:]) return for i in range(start, len(candidates)): if self.sum + candidates[i] > target: # 剪枝 break self.sum += candidates[i] self.path.append(candidates[i]) self.backtrack(candidates, target, i) # 可重复使用元素:i 而不是 i+1 self.sum -= candidates[i] self.path.pop()
40. 组合总和 II
class Solution: def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: self.path = [] self.res = [] self.sum = 0 candidates.sort() # 排序后方便跳过重复元素 self.backtrack(candidates, target, 0) return self.res
def backtrack(self, candidates, target, start): if self.sum == target: self.res.append(self.path[:]) return for i in range(start, len(candidates)): if candidates[i] + self.sum > target: break # 剪枝 # 这里判断 i > start 而不是 i > 0 是因为我们需要跳过同一层的重复元素 if i > start and candidates[i] == candidates[i - 1]: continue # 跳过同层重复 self.sum += candidates[i] self.path.append(candidates[i]) self.backtrack(candidates, target, i + 1) # 元素不可重复使用:i+1 self.sum -= candidates[i] self.path.pop()
131. 分割回文串
class Solution: def partition(self, s: str) -> List[List[str]]: self.path = [] # 当前回文分割路径 self.res = [] # 所有合法回文组合 self.backtrack(s, 0) return self.res
def backtrack(self, s, start): if start == len(s): self.res.append(self.path[:]) return for i in range(start, len(s)): if not self.isPalindrome(s, start, i): continue self.path.append(s[start:i + 1]) # 做选择 self.backtrack(s, i + 1) # 递归处理剩余子串 self.path.pop() # 撤销选择
def isPalindrome(self, s, l, r): while l < r: if s[l] != s[r]: return False l += 1 r -= 1 return True
代码随想录算法训练营第二十天 | 回溯算法 Part02
https://fuwari.vercel.app/posts/code_musings_day_twenty/