My Forty-eighth Page - 组合 - By Nicolas
这篇page主要是针对leetcode上的77.组合所写的。小尼先简单的给大家说明一下这道题的意思,给出两个整数n和k,返回范围在1到n之间的所有可能k个数的集合,顺序可以随意。这里运用的方法就是回溯法。
小尼今天也根大家系统的说明一下回溯法,回溯法也可以称为回溯搜索法,其实就是一种搜索的方式,其实回溯法也不是什么高效的算法,其实就是一种穷举的写法,回溯法其实就是利用了递归的一种穷举的方法。
接下来说明一下回溯法一般的作用或者说一般用于解决哪些问题:
1、组合问题:N个数里面按照一定规则找出k个数的集合
2、切割问题:一个字符串的按照一定规则有几种切割方式
3、子集问题:一个N个数的集合里有多少符合条件的子集
4、排列问题:N个数按一定规则全排列,有集中排列方式
4、棋盘问题:N皇后、解数独问题。
回溯法解决的问题都可以抽象为树形结构,回溯法解决的都是在集合中的递归查找子集,集合的大小就构成了数的宽度,递归的深度就构成了数的深度。递归就要有终止条件,所以必然是一颗高度有限的数(N叉树)。
我们拿回溯与二叉树做一个比较,我们可以知道递归具有递归三部曲,同样回溯也是具有回溯三部曲,小尼在这里给大家总结一下。首先,第一步就是回溯函数模板返回值以及参数,在回溯算法中,我们需要给我们的函数定义一个全新的类,我们通常给这个类定义的名字叫backtracking,并且函数的返回值我们一般都为void。第二步,就是定义函数的返回值以及参数,在回溯法中,我们给函数定义的名字是bactracking,我们需要看清楚参数,因为回溯算法需要的参数不像二叉树递归的时候那么容易一次性就可以直接定下来,所以我们在写回溯算法的过程中,我们一般是先写逻辑,然后看我们的逻辑中需要些什么参数,然后我们再在我们的方法里加入我们对应的参数。第三步,就回溯函数的终止条件,既然回溯算法是一个树形结构,那么我们在讲解二叉树的递归的时候,我们就知道一定是有终止条件的,所以回溯也要有终止条件,在第三步中我们可以看到,什么时候达到了终止条件,从树中就可以看出来,一般来说是搜到了叶子节点,也就是找到了满足一条答案的值的时候,这个时候我们需要将答案存放起来,并结束本层的递归。
上面我们聊完了额回溯法,接下来我们继续解释我们上面的那道题,小尼接下来给出递归的代码:
class Solution {List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {change(n,k,1);return result;}public void change(int n,int k,int StartFirst){if(path.size() == k){result.add(new ArrayList<>(path));return;}for(int i = StartFirst ; i <= n - (k - path.size()) + 1 ; i++){path.add(i);change(n,k,i+1);path.removeLast();}} }
这上面的代码中,其实是对回溯法进行了一定的减枝,其中减枝的方法的体现就是上面的i<=n-(k-path.size())+1,这一句话小尼在最开始看的时候小尼还没有怎么看懂,但是小尼在看懂了之后小尼才觉得这句话的深度,小尼先简答的说一下这句话的作用就是,当我们的第一个list中放入越来越多的值之后,我们的区间就在不断的减少,然后当我们进行下一层for循环的遍历的时候,我们的循环的次数又会继续的改变,在这里我们在不断的递归的过程中,这一句话最巧妙的地方就是在我们的值不断的往后遍历的过程中会相应的改变,这就达到了减枝的作用。希望今天的知识可以绑帮助到小伙伴们!
My Forty-eighth Page - 组合 - By Nicolas相关推荐
- python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...
昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...
- Mysql Page结构
http://www.admin10000.com/document/5372.html 如果说前面的内容偏向于解释原理,那后面就开始涉及具体实现了. 理解InnoDB的实现不得不提Page结构,Pa ...
- 数据库事务的隔离级别 (转)
.NET 提供的数据库事务隔离级别 System.Data.IsolationLevel 枚举用于指定连接的事务锁定行为,它包含如下枚举: 成员名称 说明 Chaos 无法改写隔离级别更高的事务中 ...
- 数据库事务的隔离级别
.NET 提供的数据库事务隔离级别 System.Data.IsolationLevel 枚举用于指定连接的事务锁定行为,它包含如下枚举: Chaos 无法改写隔离级别更高的事务中的挂起的更改. R ...
- 又一款超酷的 Python 可视化神器:cutecharts
前言 今天给大家介绍一个很酷的 Python 手绘风格可视化神包:cutecharts 和 Matplotlib .pyecharts 等常见的图表不同,使用这个包可以生成看起来像手绘的各种图表,在一 ...
- ad09只在一定范围内查找相似对象_kafka日志段中的二分查找
二分查找 Kafka 中直接接触索引或索引文件的场景可能不是很多.索引是一个很神秘的组件,Kafka 官方文档也没有怎么提过它.索引这个组件的源码还有一个亮点,那就是它应用了耳熟能详的二分查找算法来快 ...
- InnoDB索引原理详解
摘要: 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本 ...
- Mysql索引原理整理
整体概念 在学习索引之前,先了解下数据库的整体概念. 逻辑架构 MySQL的逻辑结构分为三层:客户端层.核心服务层.存储引擎层. 客户层:连接处理.授权认证.安全等功能均在这一层处理. 核心服务层:包 ...
- 增删改查操作下锁的相关情况_查询时的锁分析
此系列主要分析在增删改查操作下,表是否有索引等情况下,锁的申请使用情况,研究分析并用于语句调优,数据库优化,死锁堵塞分析等:由于时间问题,该篇只分析查询的情况,下篇继续分析 锁的种类 首先,先了解下数 ...
- 3、InnoDB存储引擎
一.InnoDB体系架构 InnoDB存储引擎有多个内存块,这些内存块组成了一个大的内存池.后台线程主要负责刷新内存池中的数据.将已修改的数据刷新到磁盘. 1.1 后台线程 InnoDB后台有多个不同 ...
最新文章
- python可以自学吗需要什么基础-python自学行吗?给编程初学者零基础入门的建议...
- Transact-SQL 示例 - 查询某个数据库内的所有表的记录行数及其总和
- 关于SAP中物料双单位的解析
- 高级java技术web组件_(重温)JavaWeb--Servlet技术(二)(JavaWeb 的三大组件之一)...
- mysql5.5启动报错:The server quit without updating PID file ([FAILED]localhost.localdomain.pid)....
- FreeMarker中获取Map内容
- PDF电子书制作详细教程
- Java使用DFA算法处理敏感词汇
- 家有千金之冰糖绿豆汤
- android ppt 转图片显示不全,ppt转pdf图片显示不全怎么办
- God.org单域环境攻略(二)
- win10下Linux子系统(ubuntu)开启并配置(shell主题,设置中文环境,图形界面...)
- 数据库查询练习(一)
- 傅里叶变换的简单理解
- 前端js,将英文字符转换大小写
- 记一次天地图https无法访问
- php 时间间隔月数,PHP计算两个时间相差的年数、月数和天数程序
- 撕不撕?如何撕?跟谁撕?权力游戏致胜手册
- 高等数学(预备知识之函数的单调性、最值与奇偶性)
- TZC 高中信息技术(Python)必修题单————题解
热门文章
- 【期末不挂科 数据结构】第一章 绪论
- 王者荣耀战区在线查询_王者战力查询工具
- 全网最详细官网一键换肤教程
- ORA-28003和ORA-20001解决办法
- 专家思维模型之马太效应
- XIO: fatal IO error 25 (Inappropriate ioctl for device) on X server “localhost:13.0“
- ssh: Could not resolve hostname f: Name or service not known的解决
- 尚硅谷智慧校园 —— 1、简介及环境搭建
- 【冬瓜哥归来】传统存储老矣,新兴存储能当大任否?
- FreeBSD+gnome3详细安装指南