77.组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
解题
只能取比它大的,所以有个参数startindex
参数:一维数组单个组合path,二维数组结果集result,总数n,组合大小k,搜索结果的开始索引startindex
终止条件:path.size=k
点击查看代码
class Solution:def combine(self, n: int, k: int) -> List[List[int]]:result=[]self.backtracking(n,k,1,[],result)return resultdef backtracking(self,n,k,startIndex,path,result):if len(path)==k:result.append(path[:])returnfor i in range(startIndex,n+1):path.append(i)self.backtracking(n,k,i+1,path,result)path.pop()
剪枝优化:剪掉的是节点的子孩子,所以改为:
还需要选取的元素的个数 k-len(path)
至多从那里开始搜索 n-(k-len(path))+1
python的range范围左闭右开,所以 for i in range(startIndex,n-(k-len(path))+2):
216.组合总和
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
解题
跟上面差不多,多了个纵向剪枝,多了个参数和判断currentSum
点击查看代码
class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:result=[]self.backtracking(n,k,0,1,[],result)return resultdef backtracking(self,targetSum,k,currentSum,startIndex,path,result):if currentSum>targetSum:returnif len(path)==k:if currentSum==targetSum:result.append(path[:])returnfor i in range(startIndex,9-(k-len(path))+2):currentSum+=ipath.append(i)self.backtracking(targetSum,k,currentSum,i+1,path,result)currentSum-=ipath.pop()
17.电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
解题
参数:字符串digits,index
上两题是在一个集合里找组合,需要startIndex避免已经用过的元素,这里是在两个集合里找,用Index
终止:index==len(digits),因为index从0开始,所以此时指向号码后一位,以防最后一个数字不处理了
字符串的增删:
点击查看代码
s=""
s += letters[i]
s = self.s[:-1]
看答案里result和s都写在全局变量里self.result,递归函数的传递参数就不用result和s了,我还是照老的写的
点击查看代码
class Solution:def __init__(self):self.letterMap=["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]def backtracking(self,digits,index,result,s):if index==len(digits):result.append(s)return#找到当前递归层index对应的数字和相映的字母digit=int(digits[index])letters=self.letterMap[digit]for i in range(len(letters)):s+=letters[i]self.backtracking(digits,index+1,result,s)s=s[:-1]def letterCombinations(self, digits: str) -> List[str]:if len(digits)==0:return []result=[]self.backtracking(digits,0,result,"")return result