39. 组合总和
题目
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
solution
一定要注意:收集结果的时候,因为是shallow copy,所以不能append(path)
class Solution:
def __init__(self):
self.res=[]
self.path=[]
def backtracking(self,candidates,targetsum,cursum,startindex):
if cursum>targetsum:return
if cursum==targetsum:
self.res.append(self.path[:])
return
for i in range(startindex,len(candidates)):
cursum+=candidates[i]
self.path.append(candidates[i])
self.backtracking(candidates,targetsum,cursum,i)# 为了可重复利用 需要把已经选过的元素带上,所以这块是i不是i+1
cursum-=candidates[i]
self.path.pop()
return
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.backtracking(candidates,target,0,0)
return self.res
40. 组合总和 II
题目
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。
我的问题
我不会去重
Eg: candidates = [10,1,2,7,6,1,5], target = 8
candidate集合中有重复元素!!!!!!!
[1,2,6]=[2,6,1]
solution
去看视频,used数组真的很巧妙!!!!!!!!!!!!!!!!
class Solution:
def __init__(self):
self.res=[]
self.path=[]
def backtracking(self,candidates,target,cursum,startindex,used):
if cursum>target:return
if cursum==target:
self.res.append(self.path[:])
return
for i in range(startindex,len(candidates)):
if i>=1 and candidates[i]==candidates[i-1] and used[i-1]==0:continue
cursum+=candidates[i]
used[i]=1
self.path.append(candidates[i])
self.backtracking(candidates,target,cursum,i+1,used)
cursum-=candidates[i]
used[i]=0
self.path.pop()
return
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
#print(candidates)
used=[0]*len(candidates)
self.backtracking(candidates,target,0,0,used)
return self.res
131.分割回文串(好难噢 想不到 虽然是模板题)
题目
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]
solution
class Solution:
def __init__(self):
self.res=[]
self.path=[]
def ishuiwen(self,s):
if s==[]:return False
if s==s[::-1]:return True
return False
def backtracking(self,s,startindex):
#print(s)
if startindex>=len(s):
self.res.append(self.path[:])
return
for i in range(startindex,len(s)):
if self.ishuiwen(s[startindex:i+1]): #应该是i+1,左闭右开
self.path.append(s[startindex:i+1])
self.backtracking(s,i+1)
self.path.pop()
else:continue
return
def partition(self, s: str) -> List[List[str]]:
self.backtracking(s,0)
return self.res
我的bug
if self.ishuiwen(s[startindex:i+1]): #应该是i+1,左闭右开
这一行一开始写成了i