当前位置: 首页 > news >正文

力扣面试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

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即可

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
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;
           }
       }
    }
}

相关文章:

  • Alembic 和 fbx存储结构和存储动画对比
  • 48、Spring Boot 详细讲义(五)
  • 最新扣子实战教程,利用扣子平台通过在线表格记录,批量生图,再也不要一条条的粘贴提示词了
  • 如何查看网页或任意文档中的颜色数值
  • 如何用DeepSeek大模型提升MySQL DBA工作效率?实战案例解析
  • 英飞凌TLE9891 +TLE5501 有感油泵FOC控制方案
  • truss开源程序在生产中提供 AI/ML 模型的最简单方法
  • v837s-ov5640摄像头调试
  • 泊松分布详解:从理论基础到实际应用的全面剖析
  • Enovia许可释放
  • 3.vtkProp 和vtkProp3D
  • 三维物体消隐处理
  • numpy.ma.masked_where:屏蔽满足条件的数组
  • 企业数字化转型深度解析:政策驱动、核心要素、技术路径、实战策略与未来趋势
  • Sql Server(自用查看版)
  • 电路图通用设计规范
  • 串口通信简述
  • 系统监控 | 简易多个内网服务器的CPU和内存使用率监控 system_moniter
  • cryptozombies合约7
  • KF V.S. GM-PHD
  • 解除近70家煤电厂有毒物质排放限制,特朗普能重振煤炭吗?
  • 徐州沛县一村委会因无资质处理固废,被环保部门罚款19万元
  • “一城双白金”就在脚下!这场半马将以最高标准打造
  • 用户称被冒用身份证异地办卡申请注销遭拒,澎湃介入后邯郸联通着手办理剥离
  • 中使馆驳斥加方炒作所谓“中国网络威胁”行为:停止无端攻击抹黑
  • “80后”李建强已任内蒙古镶黄旗委书记