題目描述:給一個n * n的二維數(shù)組表示的圖片皱碘,將其原地順時針旋轉(zhuǎn)90度金拒。如:
Given input matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
rotate the input matrix in-place such that it becomes:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
分析:如果可以重新申請一個 n * n 的矩陣蚕甥,則分析元素變換前后的位置關(guān)系可得:
A[ i ][ j ] <——> A[ j ][ n - 1 - i]却妨,代碼如下:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
vector<vector<int>> v(n); //vector必須先指明其大小才能用下標(biāo)賦值耗帕,這一步只指明了一層
for (int i = 0; i < n ; i ++)
v[i].resize(n); //每層大小為n
for (int i = 0; i < n ; i ++)
{
for (int j = 0; j < n ; j ++)
v[j][n - 1 - i] = matrix[i][j];
}
for (int i = 0; i < n ; i ++)
{
for (int j = 0; j < n ; j ++)
cout<<v[i][j]<<" "; //改為matrix[i][j] = v[i][j]; 也可通過
cout<<endl;
}
}
};
但是已規(guī)定原地和變換另玖,且原函數(shù)無返回值佣赖,即輸入矩陣matrix默認為評測對象恰矩,若修改其他矩陣返回的仍是原輸入矩陣。
代碼:先沿著副對角線翻轉(zhuǎn)一次憎蛤,再沿著水平中線翻轉(zhuǎn)一次。時間復(fù)雜度O(n^2)俩檬,空間O(1)萎胰。先沿著水平中線翻轉(zhuǎn)一次,再沿著副對角線翻轉(zhuǎn)一次也是一樣的棚辽,復(fù)雜度相同技竟。
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
//沿著副對角線翻轉(zhuǎn)
for (int i = 0; i < n ; i ++)
{
for (int j = 0; j < n - i; j ++)
swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]);
}
//沿著水平中線翻轉(zhuǎn)
for (int i = 0; i < n/2; i ++)
for (int j = 0; j < n; j ++)
swap(matrix[i][j], matrix[n - 1 - i][j]);
}
};