力扣面试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,则将matrix0j和 matrixi0置为0;
  3. 再此遍历数组,如果matrix0j或 matrixi0为0,就将 matrixij置为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;
           }
       }
    }
}
相关推荐
To_OC6 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎7 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC7 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
tachibana218 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
晚笙coding20 小时前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
兰令水21 小时前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
退休倒计时1 天前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
旖-旎2 天前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
良木林2 天前
滑动窗口 - LeetCode hot 100
javascript·算法·leetcode·双指针·滑动窗口
晚笙coding2 天前
LeetCode 108:将有序数组转换为二叉搜索树 —— 从数组到平衡二叉树的递归构造
数据结构·算法·leetcode