邻接矩阵的DFS遍历代码模板:

bool flag;
void dfs(vector<vector<int>> &grid, int x, int y) {
    static int dx[] = {-1, 0, 1, 0};
    static int dy[] = {0, 1, 0, -1};
    grid[x][y] = 3; // 标记已访问
    for(int i = 0; i < 4; i++) {
        int tx = x + dx[i];
        int ty = y + dy[i];
        if(tx < 0 || ty < 0 || tx >= grid.size() || ty >= grid[0].size()) {
            // 只有当前点是0才会有dfs搜索,如果搜到出界了,表明当前点(x,y)就在边界上,不符合封闭岛定义
            flag = false;
        } else if(grid[tx][ty] == 0) {
            dfs(grid, tx, ty);
        }
    }
}

贪心:

https://leetcode-cn.com/problems/advantage-shuffle/

一定是每一步都有当前的最优解才可以用贪心算法,如果不到最后一步都不知道哪个是最优秀解,贪心就失效了,比如这题:https://leetcode-cn.com/problems/maximum-score-from-performing-multiplication-operations/,这里,每次选从左右里选一个,貌似可以用贪心拿到每次的最优解,但是其实是错误的,有可能上一步的最优解把下一步更优的解排除了,所以不到最后一步,都无法确定哪个是最优的,也就不能应用贪心算法来求解。

并查集合:

https://leetcode-cn.com/problems/number-of-provinces/

对于并查集来说,刚建好的集合有些路径可能是没压缩的,所以在执行查找时可以顺便执行一次压缩,而且查找时的路径压缩是针对整条路径上的点进行压缩,而不单单是末端结点。

快速幂:

https://leetcode-cn.com/problems/count-good-numbers/

前缀和:

https://leetcode-cn.com/problems/subarray-sums-divisible-by-k/

滑动窗口:

https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/

单调栈:

https://leetcode-cn.com/problems/daily-temperatures/

双指针:

https://leetcode-cn.com/problems/reverse-only-letters/

  • 无标签