leetcode-19-回溯-组合问题(剪枝、去重)

引自代码随想录

一、77组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例: 输入: n = 4, k = 2 输出: \[2,4, 3,4, 2,3, 1,2, 1,3, 1,4]

1、大致逻辑

k为树的深度,到叶子节点的路径即为一个结果

开始索引保证不重复取数(从当前位置往后取值)

每一个节点为一个for循环

2、剪枝(优化)

(1)和大于n,结束递归。

(2)剩余元素不足以满足k(k个元素)

剩下所需元素:k-path.size()

至多从该起始位置开始遍历(否则元素个数不够):n - (k - path.size()) + 1

为什么有个+1呢,因为包括起始位置(从起始位置开始遍历)

我们要是一个左闭的集合(重要!!!!)

path.size() : 已经找的个数

k-path.size() :还需找的个数

x, n的数组长度起码应该是k-path.size()才有继续搜索的可能

那么 n-x+1 = k-path.size()

解方程得 x = n+1 - (k-path.size()),

而且这个x是可以作为起点往下搜的

也就是for(i = s; i<=x; i++) 这里的x是可以取到的

类似题目21617(有点难度)、3940(需要对开始索引做处理)

相关推荐
shehuiyuelaiyuehao25 分钟前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
hanlin0339 分钟前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang1 小时前
第02章 对话时间线与延迟分析
算法
科学实验家1 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
学习智者1 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄
Jasmine_llq1 小时前
《P10263 [GESP202403 八级] 公倍数问题》
算法·数论·快速 io 优化·埃氏筛(倍数枚举)·线性遍历求和
橘子汽水1681 小时前
Leetcode 322 279 零钱兑换,完全平方数
算法·leetcode
kevin_kang1 小时前
第01章 VoiceAgent 的总体架构与完整流程
算法
Lintongzg1 小时前
KV-Cache 的显存账本:长上下文、并发与量化剪枝的取舍
算法·机器学习·剪枝
小孩玩什么1 小时前
深入理解字符串匹配算法:BF算法,KMP算法
java·c语言·开发语言·数据结构·c++·算法