力扣面试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;
           }
       }
    }
}
相关推荐
_Itachi__8 小时前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵
chao_7899 小时前
链表题解——两两交换链表中的节点【LeetCode】
数据结构·python·leetcode·链表
编程绿豆侠11 小时前
力扣HOT100之多维动态规划:1143. 最长公共子序列
算法·leetcode·动态规划
dying_man20 小时前
LeetCode--24.两两交换链表中的结点
算法·leetcode
yours_Gabriel20 小时前
【力扣】2434.使用机器人打印字典序最小的字符串
算法·leetcode·贪心算法
GGBondlctrl21 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
枫景Maple1 天前
LeetCode 2297. 跳跃游戏 VIII(中等)
算法·leetcode