| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 算法 - 组合 -> 正文阅读 |
|
[数据结构与算法]算法 - 组合 |
目录 题目来源题目描述给定两个整数? 你可以按?任何顺序?返回答案。 示例
提示
题目解析这题就是求组合的问题。 组合和排列的区别在于,组合是无顺序性的,而排列是有顺序性的。 比如在[1,2,3]中任选两个数字的全排列有:
而全组合有:
也就是说,对于组合来说12和21是同一个。 组合的求解也可以模拟为一个树结构 黄色部分是第一层选择完后,剩余可选数。 有人可能有疑问,为什么第一层选完2后,剩余可选数不是13,而是只有3呢? 我们假设第一层选完2后,剩余可选数是13,则 ?最终会产生12和21这种重复组合。 因此组合的树结构,单层节点选择时,如果采用for顺序遍历的话,则后面层级节点选择起始位置 要比 前面层级节点选择起始位置 + 1。 比如第一层选择了1,则第二层从2开始选 比如第一层选择了2,则第二层从3开始选 只有这样才能避免重复。 组合由于和排列问题一样也能用树结构模拟,因此也可以用回溯算法,基于递归模型进行实现。 假设,从n个数中选择k个数,每层得到节点保存进path中,则当path.length === k 时,说明已经选择了path中已经保存了k个数,符合结束要求,结束递归。 每层节点选择没有特殊条件的话,即只要保证后面层级节点选择的起始位置,是上一层选择的节点的位置i的后一个,即i+1,这样才能保证无重复的组合。 算法源码
剪枝优化?题目中提示
?当第一层取2时,第二层可选数字就只有3了,因此这个分叉的结果为23,由于不满足k=4,因此最终会丢弃。 剪枝优化,指的是,我们可以提前判断某分支是否符合最终要求,若不符合要求,则再其走递归流程前就结束它。 ?比如当第一层选取2后,理论上还需要选择k-1=2个元素,但是实际上,第一层选完2后,只能选3了,即只剩余1个元素可选,因此我们不需要走完递归流程,也知道此分支的结果是不符合要求的,因此可以提前结束。
但是上面代码中的剪枝策略,依旧存在无意义的for循环遍历,循环的结束条件都放到了循环体中,因此可以继续优化
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:38:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |