Golang | Leetcode Golang题解之第40题组合总和II

题目:

题解:

Go 复制代码
func combinationSum2(candidates []int, target int) (ans [][]int) {
    sort.Ints(candidates)
    var freq [][2]int
    for _, num := range candidates {
        if freq == nil || num != freq[len(freq)-1][0] {
            freq = append(freq, [2]int{num, 1})
        } else {
            freq[len(freq)-1][1]++
        }
    }

    var sequence []int
    var dfs func(pos, rest int)
    dfs = func(pos, rest int) {
        if rest == 0 {
            ans = append(ans, append([]int(nil), sequence...))
            return
        }
        if pos == len(freq) || rest < freq[pos][0] {
            return
        }

        dfs(pos+1, rest)

        most := min(rest/freq[pos][0], freq[pos][1])
        for i := 1; i <= most; i++ {
            sequence = append(sequence, freq[pos][0])
            dfs(pos+1, rest-i*freq[pos][0])
        }
        sequence = sequence[:len(sequence)-most]
    }
    dfs(0, target)
    return
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}
相关推荐
我要学编程(ಥ_ಥ)3 小时前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
chenziang13 小时前
leetcode hot100 对称二叉树
算法·leetcode·职场和发展
林的快手6 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
Dream it possible!9 小时前
LeetCode 热题 100_LRU 缓存(35_146_中等_C++)(哈希表 + 双向链表)(构造函数声明+初始化列表=进行变量初始化和赋值)
c++·leetcode·缓存
xiaocaibao77711 小时前
编程语言的软件工程
开发语言·后端·golang
chenziang111 小时前
leetcode hot100
算法·leetcode·职场和发展
xiaocaibao77713 小时前
Java语言的网络编程
开发语言·后端·golang
木向14 小时前
leetcode22:括号问题
开发语言·c++·leetcode
蹉跎x14 小时前
力扣1358. 包含所有三种字符的子字符串数目
数据结构·算法·leetcode·职场和发展
程序猿-瑞瑞17 小时前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm