[Mdfs] lc1718. 构建字典序最大的可行序列(dfs+双周赛43_3)

1. 题目来源

链接:1718. 构建字典序最大的可行序列

2. 题目解析

前导题:

很标准的 dfs 暴搜问题,十分类似于上述两道前导题。但是考场上被第二题折磨的体无完肤,加上不相信暴力也能过题,就直接放弃了…
在这里插入图片描述

思路:

  • 按字典序从大到小暴搜即可。
  • 数字 1 的情况单独处理,因为它只出现一次,在任意位置均有可能,关键是能否正确返回最终答案。
  • 注意回溯时候恢复现场。
  • dfs 返回值为 bool 很方便找到答案的时候一路直接返回,不需要再去做一大堆判断了!

  • 时间复杂度 O ( 指 数 级 别 , 具 体 不 会 分 析 ) O(指数级别,具体不会分析) O()
  • 空间复杂度 O ( 不 会 分 析 ) O(不会分析) O()

代码:

class Solution {
public:
    int n;
    vector<bool> st;
    vector<int> path;

    vector<int> constructDistancedSequence(int _n) {
        n = _n;
        st.resize(n + 1, false);
        path.resize(2 * n - 1, 0);
        dfs(0);
        return path;
    }

    bool dfs(int u) {
        if (u == 2 * n - 1) return true;
        if (path[u]) return dfs(u + 1);

        for (int i = n; i > 1; i -- ) {
            if (!st[i] && u + i < 2 * n - 1 && !path[u + i]) {
                path[u] = path[u + i] = i;
                st[i] = true;
                if (dfs(u + 1)) return true;
                path[u] = path[u + i] = 0;
                st[i] = false; 
            }
        }

        if (!st[1]) {
            st[1] = true;
            path[u] = 1;
            if (dfs(u + 1)) return true;
            st[1] = false;
            path[u] = 0;
        }
        return false;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值