回溯法打印卡特兰数问题--牛客编程题解题记录

今天在牛客上做到一个题,用到了卡特兰数的知识。
那道题我会单独写一篇博客,这里把其中一个子问题抽象出来,给出代码方案:
给了长度为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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值