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

代码随想录算法训练营day24 || 回溯法原理讲解,77.组合

回溯方法的理论原理与定义

  • 回溯算法是潜藏于递归过程之中一种操作,与递归操作相辅相成;初步理解,有递归必有回溯,使用回溯最好的方式是递归,至于其他的方式有待探索。
  • 回溯是一种多重循环的变体,其本质就是对一个可选元素集合进行不断的循环遍历,直到输出所有可行的结果;
  • 回溯可用于解决组合问题、排列问题、棋盘问题、子集问题、切割问题;
  • 回溯的过程可以可视化为多叉树,每一种当前的元素挑选都将在多叉树上开辟一条新的分枝;而提升回溯时间的效率的操作名为剪枝,联合多叉树的可视化结果,显然这个概念也不难理解了;
  • 剪枝的本意在于“当前结果集的可选内容无法满足可行结果的继续计算,因此我们提前停止,避免额外的计算”;
  • 要熟练回溯的模版 代码随想录
    void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
    }
    

第77题. 组合

思路:使用回溯法进行多层遍历实现解题,可使用剪枝加快不可满结果继续计算时,就提前结束当前的分支的递归过程。

// 时间复杂度O((n+1)n/2) = O(n^2)
// 空间复杂度O(n^2)class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> ans = new ArrayList<>();List<Integer> list = new ArrayList<>();boolean[] visited = new boolean[n];backtracking(0, n, k, -1, list, ans);return ans;}// 参数说明// count用来计数list中元素的个数;// n,k不解释;// index用来剪枝颠倒组合的情况发生,保证只有一个方向的组合// list存储每一次形成的可行组合,ans全局结果集public void backtracking(int count, int n, int k, int index, List<Integer> list, List<List<Integer>> ans){// 停止条件if(count == k){ans.add(new ArrayList<Integer>(list));  // 收集结果return;}// 剪枝,用的用的是k-count还需要几个数,与n-index-1还剩几个可选进行的比较用来剪枝if(k-count > n-index-1)return;// 递归处理for(int i = index+1; i<n; i++){count++;list.add(i+1);backtracking(count, n, k, i, list, ans);// 回溯count--;list.remove(list.size()-1);}return;
}}

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

相关文章:

  • RPA与通知机器人的完美结合
  • openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c
  • 高效批量剪辑技巧:一键按指定时长精准分割视频的方法,轻松制作视频
  • Android基础知识
  • linux下把动态库变成静态库
  • 基于STM32单片机设计的智能水温控制系统
  • PIL——图像读取、裁剪、保存操作
  • Windows 下 QT开发环境的搭建:
  • 深度学习中Numpy的一些注意点(多维数组;数据类型转换、数组扁平化、np.where()、np.argmax()、图像拼接、生成同shape的图片)
  • (2023版)斯坦福CS231n学习笔记:DL与CV教程 (56) | 卷积神经网络
  • 表单验证 ---- 在Vue2中使用ElementUI进行表单验证
  • HarmonyOS 转场动画 ForEach控制
  • 2024--Django平台开发-订单项目管理(十四)
  • Docker 安装 CentOS
  • 方案解决:5G基站节能及数字化管理
  • JavaScript深浅拷贝的几种方式
  • VBA窗体跟随活动单元格【简易版】(2/2)
  • 个性化定制的知识付费小程序,为用户提供个性化的知识服务
  • 【轮式平衡机器人】——软硬件配置/准备
  • 中国联通助力吴江元荡生态岸线打造5G+自动驾驶生态长廊
  • 小白准备蓝桥杯之旅(c/c++b组)
  • Flutter GetX 之 国际化
  • 349. 两个数组的交集(力扣)(OJ题)
  • 安全帽识别-赋能深圳自贸中心智慧工地
  • 代码之外:工程师的成长进阶秘籍
  • openssl3.2 - 官方demo学习 - smime - smsign2.c
  • 6.C++对象模型
  • AbstractHttpMessageConverter + easyexcell优雅下载附件
  • 虚拟线程探索与实践
  • openssl3.2 - 官方demo学习 - mac - poly1305.c