Leetcode5635. 构建字典序最大的可行序列[C++题解]:dfs暴搜

文章目录

题目

题目重述:给定一个数n,求一个长度为2n-1的序列:1只出现一次,2~n之间每个数出现2次,并且 对于2 ~n之间的每个数i,两个i之间相差为i,比如n=3,[3,1,2,3,2] ,两个3之间距离为3,两个2距离为2. 换言之,知道 第一个数i的下标x,第二个下标就确定了x+i。 要求满足条件的字典序最大的序列。

数据范围n≤20.

思路:想到暴搜
ac代码

class Solution {
public:
    int n;
    vector<bool>st;  //1~n这些数是否用过
    vector<int> path; //最终结果数组
    //对于下标u,我能放什么
    bool dfs(int u){
        //退出条件
        if(u==2*n-1) return true;

        if(path[u])  return dfs(u+1);

        //字典序最大,需要倒序遍历n~2,看看是否可以放在path[u] 和path[u+i]
        for(int i=n;i>1;i--){
            if(!st[i] && u+i <2*n-1&& !path[u+i]){
                path[u]=path[u+i]=i;// 放上i
                st[i]=true;//用过了
                if(dfs(u+1)) return true;//如果有解,返回true
                //恢复现场
                st[i]=false;
                path[u]=path[u+i]=0; 
            }
        }
        //特判1这个数
        if(!st[1]){
            st[1]=true;
            path[u]=1;
            if(dfs(u+1)) return true;  //如果有解,返回true
            //恢复现场
            path[u]=0;  
            st[1]=false;
        }
        return false;

    }

    vector<int> constructDistancedSequence(int _n) {
        n=_n;
        st.resize(n+1,false); //都没访问过
        path.resize(2*n-1);
        dfs(0);

        return path;

    }
};

题目链接

Leetcode5635. 构建字典序最大的可行序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值