力扣面试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;
           }
       }
    }
}
相关推荐
Swift社区7 小时前
Swift 实战:实现一个简化版的 Twitter(LeetCode 355)
leetcode·swift·twitter
火车叨位去194912 小时前
力扣top100(day04-05)--堆
算法·leetcode·职场和发展
Miraitowa_cheems13 小时前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
楼田莉子15 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
姜不吃葱17 小时前
【力扣热题100】双指针—— 接雨水
数据结构·算法·leetcode·力扣热题100
zzx_blog17 小时前
简单易懂的leetcode 100题-第三篇 移动0,颜色分类,数组中的第K个最大元素
leetcode·面试
qq_5139704418 小时前
力扣 hot100 Day76
算法·leetcode·职场和发展
一匹电信狗2 天前
【C++】异常详解(万字解读)
服务器·c++·算法·leetcode·小程序·stl·visual studio
墨染点香2 天前
LeetCode 刷题【43. 字符串相乘】
算法·leetcode·职场和发展
Keying,,,,2 天前
力扣hot100 | 矩阵 | 73. 矩阵置零、54. 螺旋矩阵、48. 旋转图像、240. 搜索二维矩阵 II
python·算法·leetcode·矩阵