Leetcode Notes - 刷题随笔

Posted lincs97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode Notes - 刷题随笔相关的知识,希望对你有一定的参考价值。

 

200. Numbers of Islands
***********************
class Solution {
    // 首先定义四个方向的向量,方便计算矩阵上下左右的位置
    final static int [][]dirs = {{-1, 0},
                                 {1, 0},
                                 {0, -1},
                                 {0, 1}
                                 };
    public int numIslands(char[][] grid) {
        // corner case
        if (grid == null || grid.length == 0 || grid[0].length == 0){
            return 0;
        }
        int count = 0;
        final int rows = grid.length;
        final int cols = grid[0].length;
        // 用DFS遍历所有的相邻1的位置
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++){
                if (grid[i][j] == 1){
                    count++;
                    dfs(grid, i, j, rows, cols);
                }
            }
        return count;
    }
    
    public void dfs(char[][]grid, int x, int y, int rows, int cols){
        if (x < 0 || x >= rows || y < 0 || y >= cols || grid[x][y] == 0){
            return;
        }
        grid[x][y] = 0;
        for (int []dir : dirs){
            int next_x = dir[0] + x;
            int next_y = dir[1] + y;
            dfs(grid, next_x, next_y, rows, cols);
        }
    }
}
***************************************

700. Search in a Binary Search Tree
    

701. Insert into a BST
***************************************
    if root:
        if target < root and not root.left:
            into(root.left)
        elif target > root and not root.right:
            into(root.right)
        else:
            if target < root:
                root.left = target
            else:
                root.right = target

#63. Unique Path
    方法1:动态规划问题,从下至上递推求解
    int uniquePaths(int m, int n) {
        if (m==0||n==0)
            return 0;
        auto f = vector<vector<int>>(n+1, vector<int>(m+1, 0));
        f[1][1] = 1;
        for (int y = 1; y <= n; y++){
            for (int x = 1; x <= m; x++){
                if (x==1 && y==1){
                    continue;              
                }
                else{
                    f[y][x] = f[y-1][x] + f[y][x-1];  
                }
            }
        }
        return f[n][m];
    
    方法2: 记忆化递归求解,耗时较长
    public:
    int uniquePaths(int m, int n) {
        if (m<0 || n<0)
            return 0;
        if (m==1 && n==1)
            return 1;
        if (memo[m][n] > 0)
            return memo[m][n];
        int left_path = uniquePaths(m-1, n);
        int up_path = uniquePaths(m, n-1);
        memo[m][n] = left_path + up_path;
        return memo[m][n];
    }
    private:
        unordered_map<int, unordered_map<int, int>> memo;
    
    总结:基本思路一致,就是若要求得走到(m,n)的位置,即f[m][n],只有从left和up两个方向进行考虑
    即f[m][n] = f[m-1][n] + f[m][n-1],直到终止条件为起点。

98. Validate a BST
    两种办法:
        1. 递归。通过递归在分别对左子树和右子树进行如下检查:
            初始状态:(-∞ < root.value < ∞)
            对左子树: (-∞ < root.left.value < root.val)
            对左子树:保持下界不变,改变上界值为其父节点(它的根节点)的值,判断root.left.val 是否比根节点要小,check(root.left, low, root.val)

            对右子树: (root.val < root.right.value < ∞)
            对右子树:保持上界不变,改变下界值为父节点(它的根节点)的值,
                    判断root.right.val 是否比根节点大,check(root.right, root.val, high)

        2. 中序遍历,in-order traversal


107. 层序遍历
    1. res = queue = []
    2. queue.append(root)
    3. while len(queue) != 0:
        temp = []
        quesize = len(queue)
        for i in range(quesize):
            node = queue.pop(0)
            if node.left is not None:
                queue.append(node.left)
            if node.right is not None:
                queue.append(node.right)
            temp.append(node.val)
        res.append(temp)
    4. return res

 

以上是关于Leetcode Notes - 刷题随笔的主要内容,如果未能解决你的问题,请参考以下文章

算法 Notes|LeetCode 26. 删除排序数组中的重复项 - easy

算法 Notes|LeetCode 26. 删除排序数组中的重复项 - easy

算法 Notes|LeetCode 1. 两数之和 - easy

算法 Notes|LeetCode 14. 最长公共前缀 - easy

算法 Notes|LeetCode 14. 最长公共前缀 - easy

markdown PHPExcel Notes和代码片段