• <matrix> 73 329


    73. Set Matrix Zeroes

    - 先扫描第一行第一列,如果有0,则将各自的flag设置为true
    - 然后扫描除去第一行第一列的整个数组,如果有0,则将对应的第一行和第一列的数字赋0
    - 再次遍历除去第一行第一列的整个数组,如果对应的第一行和第一列的数字有一个为0,则将当前值赋0
    - 最后根据第一行第一列的flag来更新第一行第一列

    class Solution {
        public void setZeroes(int[][] matrix) {
            boolean isZeroCol = false;
            boolean isZeroRow = false;
            
            for(int i = 0; i < matrix.length; i++){//check first Col
                if(matrix[i][0] == 0){
                    isZeroCol = true;
                    break;
                }
            }
            for(int i = 0; i < matrix[0].length; i++){//check first row
                if(matrix[0][i] == 0){
                    isZeroRow = true;
                    break;
                }
            }
            for(int i = 1; i < matrix.length; i++){//check except first row and col
                for(int j = 1; j < matrix[0].length; j++){
                    if(matrix[i][j] == 0){
                        matrix[i][0] = 0;
                        matrix[0][j] = 0;
                    }
                }
            }
            for(int i = 1; i < matrix.length; i++){//process except first row and col
                for(int j = 1; j < matrix[0].length; j++){
                    if(matrix[i][0] == 0 || matrix[0][j] == 0)
                        matrix[i][j] = 0;
                }
            }
            if(isZeroCol){
                for(int i = 0; i < matrix.length; i++){
                    matrix[i][0] = 0;
                }
            }
            if(isZeroRow){
                for(int j = 0; j < matrix[0].length; j++){
                    matrix[0][j] = 0;
                }
            }
        }
    }

    329. Longest Increasing Path in a Matrix

    我们需要维护一个二维动态数组dp,其中dp[i][j]表示数组中以(i,j)为起点的最长递增路径的长度,初始将dp数组都赋为0,当我们用递归调用时,遇到某个位置(x, y), 如果dp[x][y]不为0的话,我们直接返回dp[x][y]即可,不需要重复计算。我们需要以数组中每个位置都为起点调用递归来做,比较找出最大值。在以一个位置为起点用DFS搜索时,对其四个相邻位置进行判断,如果相邻位置的值大于上一个位置,则对相邻位置继续调用递归,并更新一个最大值,搜素完成后返回即可,参见代码如下:

    class Solution {
        public int longestIncreasingPath(int[][] matrix) {
            if (matrix == null || matrix.length == 0) return 0;
            int rows = matrix.length, cols = matrix[0].length;
            int[][] dp = new int[rows][cols];
            int res = 0;
            for(int i = 0; i < matrix.length; i++){
                for(int j = 0; j < matrix[0].length; j++){
                    if(dp[i][j] == 0){
                        dfs(matrix, i, j, dp, Integer.MIN_VALUE);
                        res = Math.max(res, dp[i][j]);
                    }
                }
            }
            
            return res;
        }
        
        private int dfs(int[][] matrix, int row, int col, int[][] dp, int prev){
            if(row > matrix.length - 1 || row < 0 ||
              col > matrix[0].length - 1 || col < 0 ||
              matrix[row][col] <= prev) return 0;
            if(dp[row][col] != 0) return dp[row][col];
            
            int left = dfs(matrix, row, col - 1, dp, matrix[row][col]);
            int right = dfs(matrix, row, col + 1, dp, matrix[row][col]);
            int up = dfs(matrix, row - 1, col, dp,  matrix[row][col]);
            int down = dfs(matrix, row + 1, col, dp, matrix[row][col]);
            
            dp[row][col] = Math.max(left, Math.max(right, Math.max(up, down))) + 1;
            return dp[row][col];
        }
    }
  • 相关阅读:
    python set 使用
    python判断字符串是字母 数字 大小写
    go语言中的运算符^,&
    golang 之 flag.String
    关于Mac或Linux下GO的Permission denied提示错误
    《算法竞赛进阶指南》0x05排序 POJ3784 对顶堆动态维护中位数
    大顶堆的基本操作(线性表建堆+siftup+siftdown+insert+delete)
    《算法竞赛进阶指南》0x05排序 环形均分纸牌问题
    SublimeText3配置c/c++环境
    《算法竞赛进阶指南》0x05 排序 离散化
  • 原文地址:https://www.cnblogs.com/Afei-1123/p/11928863.html
Copyright © 2020-2023  润新知