1. 题目来源
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;
}
};