回溯法打印卡特兰数问题--牛客编程题解题记录
2017-05-19 23:08
176 查看
今天在牛客上做到一个题,用到了卡特兰数的知识。
那道题我会单独写一篇博客,这里把其中一个子问题抽象出来,给出代码方案:
给了长度为2n的顺序数列,先将数列分成两排,要求第一排的每一列小于等于对应的第二排的数字,每排顺序排列,打印出所有排序方案。
这里我用回溯方法解决,对所有方案进行深度优先遍历,如果‘0的数量大于1’(参加上文排队问题),则返回上层。
这里我构造了两个空数列:firstLine和secondLine,从头到尾遍历长度为2n的原数组arr,每次都有两个选择方案:将arr[i]放入到firstLine或secondLine。怎么放呢?没关系,我们先进行遍历,按顺序来,如果放入后firstLine的长度大于等于secondLine,则进入下层循环。另外,为了保证回溯,一定要记得及时清理状态,在每次循环后将两个数组的状态返回为上一层的样子。
代码如下:
调用方式就是:
那道题我会单独写一篇博客,这里把其中一个子问题抽象出来,给出代码方案:
给了长度为2n的顺序数列,先将数列分成两排,要求第一排的每一列小于等于对应的第二排的数字,每排顺序排列,打印出所有排序方案。
这里我用回溯方法解决,对所有方案进行深度优先遍历,如果‘0的数量大于1’(参加上文排队问题),则返回上层。
这里我构造了两个空数列:firstLine和secondLine,从头到尾遍历长度为2n的原数组arr,每次都有两个选择方案:将arr[i]放入到firstLine或secondLine。怎么放呢?没关系,我们先进行遍历,按顺序来,如果放入后firstLine的长度大于等于secondLine,则进入下层循环。另外,为了保证回溯,一定要记得及时清理状态,在每次循环后将两个数组的状态返回为上一层的样子。
代码如下:
function catalanSort(arr,firstLine,secondLine,i){ var n=arr.length/2; if(firstLine.length==n) { //搜索到叶节点,输出一个结果 console.log(firstLine); } else { for (var j = 0; j < 2; j++) { //枚举所有可能的路径 if (j == 0) { firstLine.push(arr[i]); } else { secondLine.push(arr[i]); } //判断是否满足约束条件 if (firstLine.length >= secondLine.length) { //满足条件,扩展搜索空间 catalanSort(arr,firstLine,secondLine,i+1); } //回溯前的清理工作:清除所占的状态资源 if(j==0){ firstLine.pop(); }else{ secondLine.pop(); } } } }
调用方式就是:
catalanSort(arr,[],[],0)
相关文章推荐
- 记录andorid打印输出看不见的问题的探索
- 杭电 2553 N皇后问题 递归回溯 打表 附解题思路
- 记录华为、魅族手机无法打印 Log 日志的问题
- 关于stimusoftreports 报表打印预览时多出一空白页问题记录
- Log4j日志记录的相对路径问题与打印HQL
- recvfrom问题记录--返回值<=0狂打印
- sdut oj 3058 路线冲突问题(BFS+记录路径算法,回溯路径 )
- FCC-js 算法个人解题遇到的问题记录
- 问题 M: 打印学生的数据记录
- 打印助手-打印暂停/开始问题原因调研记录
- 动态规划;漂亮打印问题;时间复杂度O(n方); 思考方法记录在内;
- 记录华为、魅族手机无法打印 Log 日志的问题
- 记录ArcGIS Server打印服务出现的问题
- 递归解题 回溯 -- 火车进站问题
- [问题记录] spring-boot 打印启动时间
- 回溯法求装载问题
- 学习记录-使用QTabWidget在析构时需要注意的问题
- CSS学习中遇到的问题记录
- 几个页面的问题一起记录了/el表达式判断/<c:import>传值/BootstrapDialog.show关闭时刷新/
- 0-1背包问题使用回溯法