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,那么我们将第一行和第一列作为两个数组,做法如下
- 定义两个bool值,row和col,遍历数组第一行和第一列,用来记录第一行第一列是否存在0,存在则赋值为true,不存在赋值为false。
- 整体遍历数组,如果为0,则将matrix[0][j]和 matrix[i][0]置为0;
- 再此遍历数组,如果matrix[0][j]或 matrix[i][0]为0,就将 matrix[i][j]置为0
- 分别判断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;
}
}
}
}