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是可以取到的 类似题目\[216\]、\[17\](有点难度)、\[39\]、\[40\](需要对开始索引做处理)

相关推荐
Dream it possible!3 小时前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
?abc!4 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue4 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
jiunian_cn5 小时前
【c++】异常详解
java·开发语言·数据结构·c++·算法·visual studio
工藤新一¹7 小时前
蓝桥杯算法题 -蛇形矩阵(方向向量)
c++·算法·矩阵·蓝桥杯·方向向量
Levin__NLP_CV_AIGC7 小时前
解决pip安装PyPI默认源速度慢
算法·pip
Helibo447 小时前
GESPC++六级复习
java·数据结构·算法
EnticE1528 小时前
[高阶数据结构]二叉树经典面试题
数据结构·算法·面试
MarkHard1238 小时前
Leetcode (力扣)做题记录 hot100(34,215,912,121)
算法·leetcode·职场和发展
爱喝茶的小茶9 小时前
构造+简单树状
数据结构·算法