Day 26 代码随想录 组合


216. 组合总和 III

  题目链接:216. 组合总和 III
在这里插入图片描述
  这题比之前的题目多了一个条件,可以模板写。剪枝操作要记牢。

combinations 库的使用

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        from itertools import combinations
        res=[]
        nums=[i for i in range(1,n+1)]
        List=combinations(nums,k)
        for i in List:
            res.append(list(i))
        return res

回溯写法

class Solution:
    def __init__(self):
        self.path=[]
        self.Sum=0
        self.res=[]
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        def backtracking(targetsum,k,start_index):
            if self.Sum>targetsum:
                return
            if len(self.path)==k and self.Sum==targetsum:
                self.res.append(self.path[:])
                return
            last_index=10-(k-len(self.path))+1
            for i in range(start_index,last_index):
                self.path.append(i)
                self.Sum+=i
                backtracking(targetsum,k,i+1)
                self.path.pop()
                self.Sum-=i
        backtracking(n,k,1)
        return self.res

17. 电话号码的字母组合

  题目链接:17. 电话号码的字母组合
在这里插入图片描述

回溯算法

class Solution:
    def __init__(self):
        self.letter_map = {
            '2': 'abc',
            '3': 'def',
            '4': 'ghi',
            '5': 'jkl',
            '6': 'mno',
            '7': 'pqrs',
            '8': 'tuv',
            '9': 'wxyz'
        }
        self.answer=[]
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits :return []
        answers=[]
        def backtracking(digits,index,path):
            if len(path)==len(digits):
                answers.append(path)
                return
            letter: str=self.letter_map[digits[index]]
            for i in range(len(letter)):
                path=path+letter[i]
                backtracking(digits,index+1,path)
                path=path[:-1]

        backtracking(digits,0,'')
        return answers

知识点

  1. 字符串合并,str+str
  2. 删除最后一个字符,lists=list(str),lists.pop()或者path=path[:-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值