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)

avatar

55 - 跳跃游戏

和第四十五题(跳跃游戏ii) 很像, 代码也差不多 无非是从记录步数 到记录能否跳到的bool值

56 - 合并区间

经典题型了。。 又忘记了复习一下

  1. 按照start 给所有区间排序

  2. 枚举每个区间 比较最开始的end 和下一个区间的start 是否重叠;

  3. 重叠就合并

57 - 插入区间

更像是模拟题:找到有交集的那一小段区间合并,剩下的维持原样;

58 - 最后一个单词的长度

stringstream 的应用: 把字符串变成流 常用于带空格的字符串拆分;

实际上 就是找到最后的字符串就可以了 用一个指针去找: 模拟;

59 - 螺旋矩阵II

和54 螺旋矩阵 差不多 都是定义偏移量往里写就好了

60 - 排序序列

利用语法 next_permutation 也能过了 但是复杂度高

计数DP

avatar

Last updated