刷题笔记day27-回溯算法2

文章讲述了如何使用递归和回溯的方法解决组合总和III问题(1-9数中选k个数和为n且无重复),以及电话号码的字母组合问题。重点介绍了终止条件处理和广度遍历的运用。
摘要由CSDN通过智能技术生成

216. 组合总和 III

这个思路还是,三部曲:

  • 终止条件
  • 处理单层节点
  • 回溯节点

题中说的是,1到9的数,不能有重复。
k个数,和为n。
那么只要 len(path) == k 的时候,判断 n 为0,就可以入切片了。

func combinationSum3(k int, n int) [][]int {
    path = []int{}
    result = [][]int{}
    // tmpPath = make([]int, k)
    nfs(k, n, 1)
    return result
}

var path []int
var tmpPath []int
var result [][]int
func nfs(k, n, startIndex int) bool {
    // 终止条件
    if (len(path) == k ) {
        if n == 0 {
            var tmpPath = make([]int, k)
            copy(tmpPath, path)
            result = append(result, tmpPath)
        }
        return true
    }
    // 广度遍历
    for i := startIndex; i <= 9; i++ {
        // 处理单个节点
        path = append(path, i)
        // 递归
        nfs(k, n-i, i+1)
        // 回溯
        if (len(path) > 0) {
            path = path[:len(path)-1]
        }
    }
    return true
}

17. 电话号码的字母组合

这个思路就是在,每一个startIndex,都是一个key,然后在横向遍历字符串
终止条件是,startIndex > maxIndex。此时就是每一个数字都遍历到了

var table = map[byte]string {
    '2': "abc",
    '3': "def",
    '4': "ghi",
    '5': "jkl",
    '6': "mno",
    '7': "qprs",
    '8': "tuv",
    '9': "wxyz",
}

var digit string
var path []string
var result []string

func letterCombinations(digits string) []string {
    // 这个思路还是组合的问题
    if digits == "" {
        return []string{}
    }
    digit = digits
    path = []string{}
    result = []string{}
    nfs(0, len(digits)-1)
    return result
}


func nfs(currIndex, maxIndex int) bool {
    // 终止条件
    if currIndex > maxIndex {
        var tmp string
        for _, x := range path {
            tmp += x
        }
        result = append(result, tmp)
        return true
    }
    var key = digit[currIndex]
    var data = table[key]
    for i := 0; i < len(data); i++ {
        // 单个节点
        path = append(path, string(data[i]))
        nfs(currIndex+1, maxIndex)
        // 回溯
        if (len(path) > 0) {
            path = path[:len(path)-1]
        }
    }

    return true
}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值