day25| 216+17

发布时间 2023-04-08 00:06:52作者: blueCP1999

216. 组合总和III

题目简述

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

只使用数字1到9
每个数字 最多使用一次 
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

 

思路

回溯

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        res=[]

        def backtrack(list,add,depth,change_list):
            if depth==k:
                if add==n:
                    res.append([j for j in change_list])
                return

            for i in range(len(list)):
                add+=list[i]
                depth+=1
                change_list.append(list[i])
                if add<=n:
                    backtrack(list[i+1:],add,depth,change_list)
                    change_list.pop()
                    depth-=1
                    add-=list[i]
                else:
                    # list数据类型一定要pop,不pop,return后change_list并不会变成原来那样
                    change_list.pop()
                    return
        
        nums=[1,2,3,4,5,6,7,8,9]
        
        backtrack(nums,0,0,[])
        return res

 

 

17. 电话号码的字母组合

 

题目简述

 

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

 

 

 

思路

回溯

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        dict={
            "2":['a','b','c'],
            "3":['d','e','f'],
            "4":['g','h','i'],
            "5":['j','k','l'],
            "6":['m','n','o'],
            "7":['p','q','r','s'],
            "8":['t','u','v'],
            "9":['w','x','y','z']
        }
        list=[]
        

        ll=len(digits)
        if not ll:
            return list

        def backtrack(length,res,index):
            if length==ll:
                list.append(''.join(j for j in res))
                return 
            
            for i in dict[digits[index]]:
                res.append(i)
                length+=1
                backtrack(length,res,index+1)
                length-=1
                res.pop()
        
        backtrack(0,[],0)
        return list