代码随想录算法训练营第22天 | 77.组合 216.组合总和 17.电话号码的字母组合
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 result
def backtracking(self,n,k,startIndex,path,result):
if len(path)==k:
result.append(path[:])
return
for 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 result
def backtracking(self,targetSum,k,currentSum,startIndex,path,result):
if currentSum>targetSum:
return
if len(path)==k:
if currentSum==targetSum:
result.append(path[:])
return
for i in range(startIndex,9-(k-len(path))+2):
currentSum+=i
path.append(i)
self.backtracking(targetSum,k,currentSum,i+1,path,result)
currentSum-=i
path.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