1.旋转矩阵
想了那么久的各种旋转,对角线,其实把问题搞复杂了。
- 旋转90度的本质无非就是转置+镜像对称
转置是什么?:将矩阵的行和列互换。
镜像对称:把矩阵从中间对折,互换位置
矩阵 A
A = [ 1 3 0 2 4 6 ] A = \begin{bmatrix} 1 & 3 & 0 \\ 2 & 4 & 6 \\ \end{bmatrix} A=[123406]
转置后 Aᵀ
A ⊤ = [ 1 2 3 4 0 6 ] A^\top = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 0 & 6 \\ \end{bmatrix} A⊤= 130246
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n=matrix.size();//矩阵的长
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
swap(matrix[i][j],matrix[j][i]);//转置
for(int i=0;i<n;i++)
for(int j=0;j<n/2;j++)
swap(matrix[i][j],matrix[i][n-j-1]);//镜像对称
}
};
Python
class Solution(object):
def rotate(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: None Do not return anything, modify matrix in-place instead.
"""
n=len(matrix)
for i in range(n):#0,n-1
for j in range(i,n):#i,n-1
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] # 直接交换
for i in range(n):
for j in range(n//2):
matrix[i][j], matrix[i][n - j - 1] = matrix[i][n - j - 1], matrix[i][j]
2.零矩阵
思路:遍历找出0元素所在行和列的位置,把位置标记出来。
第二次遍历数组,行或列有一个被标记,就把该位置置为0
注意:int flag_row[row]={};错误
row 和 col 虽然是变量,但它们的值是在运行时确定的(比如从 matrix.size() 和 matrix[0].size() 获取),而不是在编译时确定的常量。
在标准 C++ 中,数组的大小必须是编译时常量(比如 constexpr 或 #define 定义的常量)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int row=matrix.size();//行
int col=matrix[0].size();//列
// int flag_row[row]={};
// int flag_col[col]={};
std::vector<int> flag_row(row, 0); // 初始化为全 0
std::vector<int> flag_col(col, 0); // 初始化为全 0
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(matrix[i][j]==0)
{
flag_row[i]=1;
flag_col[j]=1;
}
}
}
//置为0
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(flag_row[i]||flag_col[j])matrix[i][j]=0;
}
}
}
};
Python版本
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
row=len(matrix)
col=len(matrix[0])
flag_row=[0]*row
flag_col=[0]*col
for i in range(row):
for j in range(col):
if matrix[i][j]==0:
flag_row[i]=1
flag_col[j]=1
for i in range(row):
for j in range(col):
if flag_row[i] or flag_col[j]:
matrix[i][j]=0