当前位置: 首页 > news >正文

代码随想录算法训练营第二十四天|理论基础 77. 组合

 理论基础 

其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。

题目链接/文章讲解:代码随想录

视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili

 77. 组合  

对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。

在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。

本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。 

题目链接/文章讲解:代码随想录

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

时间复杂度: O(n * 2^n)
空间复杂度: O(n)List<List<Integer>> result= new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return result;}public void backtracking(int n,int k,int startIndex){if (path.size() == k){result.add(new ArrayList<>(path));return;}for (int i =startIndex;i<=n;i++){path.add(i);backtracking(n,k,i+1);path.removeLast();}}

剪枝:

可以剪枝的地方就在递归中每一层的for循环所选择的起始位置

如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了

 List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {combineHelper(n, k, 1);return result;}/*** 每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围,就是要靠startIndex* @param startIndex 用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。*/private void combineHelper(int n, int k, int startIndex){//终止条件if (path.size() == k){result.add(new ArrayList<>(path));return;}for (int i = startIndex; i <= n - (k - path.size()) + 1; i++){path.add(i);combineHelper(n, k, i + 1);path.removeLast();}}

http://www.lryc.cn/news/149728.html

相关文章:

  • macos安装zsh
  • 【Unity】预制体材质变(Clone)克隆体问题
  • python“魂牵”京东商品历史价格数据接口(含代码示例)
  • 密码算法、密钥体系---安全行业基础篇1
  • Java工具类记录
  • DVWA靶场搭建
  • Uniapp笔记(二)uniapp语法1
  • 【1day】PHPOK cms SQL注入学习
  • 线程同步与互斥
  • 电子词典dictionary
  • 【python爬虫】10.指挥浏览器自动工作(selenium)
  • QT文件对话框,将标签内容保存至指定文件
  • C#,《小白学程序》第十一课:阶乘(Factorial)的计算方法与代码
  • MySQL 数据库常用命令大全(完整版)
  • 【数学】【书籍阅读笔记】【概率论】应用随机过程概率论模型导论 by Sheldon M.Ross 第一章 概率论引总结与习题题解 【更新中】
  • posexplode函数实战总结
  • QTday3(对话框、发布软件、事件处理核心机制)
  • el-date-picker限制选择的时间范围
  • Scala中的Actor模型
  • Java使用pdfbox将pdf转图片
  • 大规模场景下对Istio的性能优化
  • 数字化新零售平台系统提供商,门店商品信息智慧管理-亿发进销存
  • postgresql-窗口函数
  • Revit SDK 介绍:CreateAirHandler 创建户式风管机
  • 微信小程序云开发-云函数发起https请求简易封装函数
  • 深入探索PHP编程:连接数据库的完整指南
  • 【Centos8配置节点免密登陆】
  • 不可变集合、Lambda表达式、Stream流
  • Three.js GLTF模型加载
  • 外包干了2个月,技术退步明显...