• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
many-bucket
博客园    首页    新随笔    联系   管理    订阅  订阅
hot100之矩阵

矩阵置零(073)

先看代码

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean col0_flag = false;
        int row = matrix.length;
        int col = matrix[0].length;
        for (int i = 0; i < row; i++){
            if (matrix[i][0] == 0) col0_flag =true;
            for (int j = 1; j < col; j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }    

        for (int i = row-1; i>=0; i--){
            for (int j = col-1; j >=1; j--){
                if (matrix[i][0] == 0 || matrix[0][j] == 0){
                    matrix[i][j] = 0;
                }
            }
            if (col0_flag) matrix[i][0] = 0;
        } 
    }
}
  • 分析

利用矩阵自身作为标记位 , 矩阵第0行标记每一列是否被污染, 第0列标记每一行

接下来来处理0行0列自身是否会被污染, 0行我们可以使用(0,0)做标记, 0列额外用col0_flag

螺旋矩阵(054)

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int lef = 0, rig = matrix[0].length -1;
        int top = 0, but = matrix.length -1;
        int idx = 0;
        Integer[] res = new Integer[(rig+1)*(but+1)];

        while(true){
            for (int i = lef; i <= rig; i++) res[idx++] = matrix[top][i];
            if (++top > but) break;

            for (int i = top; i <= but; i++) res[idx++] = matrix[i][rig];
            if (--rig < lef) break;

            for (int i = rig; i >= lef; i--) res[idx++] = matrix[but][i];
            if (--but < top) break;

            for (int i = but; i >= top; i--) res[idx++] = matrix[i][lef];
            if (++lef > rig) break; 
        }

        return Arrays.asList(res);
    }
}
  • 分析

简单围绕 (第0行→最后一列→最后一行 → 第0列)循环写入

旋转图像(048)

先看代码

class Solution {
    int n;
    public void rotate(int[][] matrix) {
        n = matrix.length;
        for (int i = 0; i < n; i++){
            for (int j = i; j < n; j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }

        for (int[] row : matrix){
            reverse(row);
        }
    }
    private void reverse(int[] row){
        int i = 0, j = n-1;
        while (i < j){
            int temp = row[i];
            row[i] = row[j];
            row[j] = temp;
            i++;
            j--;
        }
    }
}
  • 分析

先以对角线翻转, 再每行各自翻转

  • 感悟

数学真神奇把

搜索二维矩阵(240)

先看代码

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;
        int row = 0, col = n - 1;
        
        while (row < m && col >=0){
            if (target > matrix[row][col]) row+=1;
            else if (target < matrix[row][col]) col-=1;
            else return true;
        }
        return false;
    }
}
  • 分析

从右上角开始搜索, 利用矩阵从左到右递增、从上到下递增的特性, 每次比较可以排除一行或一列, 时间复杂度O(m+n)。

posted on 2025-06-09 13:03  crhl-yy  阅读(11)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3