代码随想录算法训练营第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
posted @ 2024-06-27 23:07  Y荷兰豆Y  阅读(5)  评论(0编辑  收藏  举报