Week 06 - Leetcode 51 - 60
51 - N皇后
+ DFS每一行必定且仅会出现一个皇后,所以按行枚举出现的位置,并用col[n], dg[n], udg[n] 记录列, 主对角线, 副对角线是否已经出现过皇后即可;
class Solution {
public:
int n;
vector<vector<string>> res;
vector<string> path;
vector<bool> col, dg, udg;
public:
vector<vector<string>> solveNQueens(int n) {
this->n = n;
// DFS - 回溯 + 剪枝
// 按行枚举 用bool数组记录 列 主斜线 副斜线
col = vector<bool>(n);
dg = vector<bool>(2 * n);
udg = vector<bool>(2 * n);
string p(n, '.');
path = vector<string>(n, p);
dfs(0);
//cout << p << endl;
return res;
}
void dfs(int u)
{
if(u == n)
res.push_back(path);
else
{
for(int i = 0; i < n; i++)
{
if(!col[i] && !dg[i + u] && !udg[n + i - u])
{
col[i] = dg[i + u] = udg[n + i - u] = true;
path[u][i] = 'Q';
dfs(u + 1);
col[i] = dg[i + u] = udg[n + i - u] = false;
path[u][i] = '.';
}
}
}
}
};52 - N皇后II
可以说和上面那个题一模一样了;
53 - 最大子序和
动态规划 f[i]表示已为结尾的连续子数组的最大和; f[i] = max(f[i - 1] + w[i], w[i]);
仅用到上一个状态 -> 空间优化;
54 - 螺旋矩阵
经典问题了 在各种地方都出现过(x)

55 - 跳跃游戏
和第四十五题(跳跃游戏ii) 很像, 代码也差不多 无非是从记录步数 到记录能否跳到的bool值
56 - 合并区间
经典题型了。。 又忘记了复习一下
按照start 给所有区间排序
枚举每个区间 比较最开始的end 和下一个区间的start 是否重叠;
重叠就合并
57 - 插入区间
更像是模拟题:找到有交集的那一小段区间合并,剩下的维持原样;
58 - 最后一个单词的长度
stringstream 的应用: 把字符串变成流 常用于带空格的字符串拆分;
实际上 就是找到最后的字符串就可以了 用一个指针去找: 模拟;
59 - 螺旋矩阵II
和54 螺旋矩阵 差不多 都是定义偏移量往里写就好了
60 - 排序序列
利用语法 next_permutation 也能过了 但是复杂度高
计数DP

Last updated