[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;
    }
};

猜你喜欢

转载自blog.csdn.net/yl_puyu/article/details/112692102