算法训练 Day 25

LeetCode 216. 组合总和 III

题目链接:216. 组合总和 III

思路:正常的回溯思路,传参中唯一需要考虑的是每次开始递归时的初始值start,因为每个数字最多使用一次,所以在递归的时候需要在i的基础上+1。

Python版本:

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        def backt(path, start):
            if sum(path) > n:
                return

            if len(path)==k:
                if sum(path)==n:
                    res.append(path[:])
                return

            for i in range(start, 10):
                path.append(i)
                backt(path, i+1)
                path.pop()

        res = []
        backt([], 1)
        return res

go版本:

var res [][]int

func combinationSum3(k int, n int) [][]int {
    res = [][]int{}
    backtracking([]int{}, 1, k, n)
    return res
}

func backtracking(path []int, start, k, n int) {
    if sum(path) > n {
        return
    }

    if len(path)==k {
        if sum(path)==n {
            tmp := make([]int, k)
            copy(tmp, path)
            res = append(res, tmp)
        }
        return
    }

    for i:=start; i<=9; i++ {
        path = append(path, i)
        backtracking(path, i+1, k, n)
        path = path[:len(path)-1]
    }
}

func sum(nums []int) int {
    sum_ := 0
    for i := range nums {
        sum_ += nums[i]
    }
    return sum_
}

LeetCode 17. 电话号码的字母组合

题目链接:17. 电话号码的字母组合

思路:需要先建立一个哈希表,以便快速的遍历各个数字对应的字母。回溯过程中最重要的一个参数就是每次回溯的起始值,本题的起始值含义与上一题完全不同,上一题的起始值是从1至9往后遍历的元素,本题的初始值是digits遍历到了第几个元素。

Python版本:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if len(digits)==0:
            return []

        phoneMap = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }
        
        def backtracking(index):
            if index==len(digits):
                res.append(''.join(path))
                return
            number = digits[index]
            for single_num in phoneMap[number]:
                path.append(single_num)
                backtracking(index+1)
                path.pop()            
                    
        path = []
        res = []
        backtracking(0)
        
        return res

go版本:

var res []string
var phoneMap map[string]string = map[string]string{
    "2": "abc",
    "3": "def",
    "4": "ghi",
    "5": "jkl",
    "6": "mno",
    "7": "pqrs",
    "8": "tuv",
    "9": "wxyz",
}

func letterCombinations(digits string) []string {
    if len(digits) == 0 {
        return []string{}
    }
    res = []string{}
    backtrack("", 0, digits)
    return res

}

func backtrack(path string, index int, digits string) {
    if index==len(digits) {
        // tmp := make([]string, index)
        // copy(tmp, path)
        res = append(res, path)
        return
    }
    nums := string(digits[index])
    letters := phoneMap[nums]
    for i := 0; i < len(letters); i++ {
        backtrack(path + string(letters[i]), index+1, digits)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值