力扣面试150题—旋转图像和矩阵置零

Day21

题目描述

思路

矩阵转置 在将列反转

1 2 3

4 5 6

7 8 9

转置

1 4 7

2 5 8

3 6 9

反转

7 4 1

8 5 2

9 6 3

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {      
     //分为两步 矩阵转置,将列倒序       
      int x=0;       
       int n=matrix.length;        
       //转置        
       for (int i = 0; i < n; i++) {           
        for (int j = i; j < n; j++) {               
         x = matrix[i][j];                
         matrix[i][j] = matrix[j][i];               
          matrix[j][i] = x;           
           }        }        
           //列数倒序      
             for (int i = 0; i < n/2; i++) {          
               for (int j = 0; j < n; j++) {                       
               x=matrix[j][i];                
               matrix[j][i]=matrix[j][n-1-i];                
               matrix[j][n-1-i]=x;            
               }       
               }    
                }
  }

题目描述

思路

初次思路:由于将其余元素置为0存在的问题是可能会漏算几个原本为0的点,于是采取两个set集合来存放置为0的行和列,之后统一置为0即可

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
         HashSet<Integer> row = new HashSet<>();
        HashSet<Integer> col = new HashSet<>();
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if(matrix[i][j] == 0) {
                    row.add(i);
                    col.add(j);
                }
            }
        }
        for(Integer i : row) {
            for(int j = 0; j < matrix[i].length; j++) {
                matrix[i][j] = 0;
            }
        }
        for(Integer i : col) {
            for(int j = 0; j < matrix.length; j++) {
                matrix[j][i] = 0;
            }
        }
    }
}

进阶思路:题目要求在O(1)的空间复杂度完成,以上做法空间复杂度为O(m+n),需要进行优化,由于我们需要两个数组来存放某行某列是否需要置为0,那么我们将第一行和第一列作为两个数组,做法如下

  1. 定义两个bool值,row和col,遍历数组第一行和第一列,用来记录第一行第一列是否存在0,存在则赋值为true,不存在赋值为false。
  2. 整体遍历数组,如果为0,则将matrix[0][j]和 matrix[i][0]置为0;
  3. 再此遍历数组,如果matrix[0][j]或 matrix[i][0]为0,就将 matrix[i][j]置为0
  4. 分别判断col和row,如果为true,就分别将第一列和第一行全置为0
java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
          boolean row=false;
       boolean col=false;//标记第一行
       for(int i=0;i<matrix.length;i++) {
           if(matrix[i][0]==0) {//说明第一列存在0
               col=true;
               break;
           }
       }
       for (int j=0;j<matrix[0].length;j++) {
           if(matrix[0][j]==0) {//说明第一行存在0
               row=true;
               break;
           }
       }
       for(int i=0;i<matrix.length;i++) {
           for(int j=0;j<matrix[0].length;j++) {
               if(matrix[i][j]==0) {//标记行和列
                   matrix[0][j]=0;
                   matrix[i][0]=0;
               }
           }
       }
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[i].length; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        
       if(col) {
           for(int i=0;i<matrix.length;i++) {//第一列置为0
               matrix[i][0]=0;
           }
       }
       if (row){
           for(int i=0;i<matrix[0].length;i++) {//第一行置为0
               matrix[0][i]=0;
           }
       }
    }
}
相关推荐
I_LPL7 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
灰色小旋风12 小时前
力扣13 罗马数字转整数
数据结构·c++·算法·leetcode
阿里嘎多哈基米14 小时前
速通Hot100-Day09——二叉树
算法·leetcode·二叉树·hot100
Frostnova丶14 小时前
LeetCode 48 & 1886.矩阵旋转与判断
算法·leetcode·矩阵
多打代码14 小时前
2026.3.22 回文子串
算法·leetcode·职场和发展
im_AMBER14 小时前
Leetcode 144 位1的个数 | 只出现一次的数字
学习·算法·leetcode
小刘不想改BUG14 小时前
LeetCode 138.随机链表的复制 Java
java·leetcode·链表·hash table
参.商.15 小时前
【Day43】49. 字母异位词分组
leetcode·golang
参.商.16 小时前
【Day45】647. 回文子串 5. 最长回文子串
leetcode·golang
Trouvaille ~16 小时前
【优选算法篇】哈希表——空间换时间的极致艺术
c++·算法·leetcode·青少年编程·蓝桥杯·哈希算法·散列表