1.旋轉矩陣
題目鏈接
想了那么久的各種旋轉,對角線,其實把問題搞復雜了。
- 旋轉90度的本質無非就是轉置+鏡像對稱
轉置是什么?:將矩陣的行和列互換。
鏡像對稱:把矩陣從中間對折,互換位置
矩陣 A
A = [ 1 3 0 2 4 6 ] A = \begin{bmatrix} 1 & 3 & 0 \\ 2 & 4 & 6 \\ \end{bmatrix} A=[12?34?06?]
轉置后 A?
A ? = [ 1 2 3 4 0 6 ] A^\top = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 0 & 6 \\ \end{bmatrix} A?= ?130?246? ?
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-1for j in range(i,n):#i,n-1matrix[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); // 初始化為全 0std::vector<int> flag_col(col, 0); // 初始化為全 0for(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;}}}//置為0for(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]*rowflag_col=[0]*colfor i in range(row):for j in range(col):if matrix[i][j]==0:flag_row[i]=1flag_col[j]=1for i in range(row):for j in range(col):if flag_row[i] or flag_col[j]:matrix[i][j]=0