矩阵转置
先看下数学上怎么定义转置矩阵的:
将矩阵的行列互换得到的新矩阵称为转置矩阵,转置矩阵的行列式不变。
同时转置矩阵有以下的运算性质:
方法 1 :转置加翻转
最直接的想法是先转置矩阵,然后翻转每一列。这个简单的方法已经能达到最优的时间复杂度O(N^2)。
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
// transpose matrix
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int tmp = matrix[j][i];
matrix[j][i] = matrix[i][j];
matrix[i][j] = tmp;
}
}
// reverse each row
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[i][n - j - 1];
matrix[i][n - j - 1] = tmp;
}
}
}
}
方法二:全部交换
c++版
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0; i < (n >> 1); ++i){
for(int j = i; j < n - 1 - i; ++j){
swap(matrix[i][j], matrix[j][n - 1 - i]);
swap(matrix[i][j], matrix[n - 1 - i][n - 1 - j]);
swap(matrix[i][j], matrix[n - 1 - j][i]);
}
}
}
};
方法三:四个值一组交换:
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n / 2 + n % 2; i++) {
for (int j = 0; j < n / 2; j++) {
int[] tmp = new int[4];
int row = i;
int col = j;
for (int k = 0; k < 4; k++) {
tmp[k] = matrix[row][col];
int x = row;
row = col;
col = n - 1 - x;
}
for (int k = 0; k < 4; k++) {
matrix[row][col] = tmp[(k + 3) % 4];
int x = row;
row = col;
col = n - 1 - x;
}
}
}
}
}