题目描述:
给你一副由N*N矩阵表示的图像,其中每个像素的大小为4个字节.请你设计一种算法,
将图像旋转90度.
可以不占用额外数组的内存空间?
示例 1:
Input:matrix=[[1,2,3],
[4,5,6],
[7,8,9]]
Output:[[7,4,1],
[8,5,2],
[9,6,2]]
示例 2:
Input:matrix=[[5,1,9,11],
[2,4,8,10],
[13,3,6,7],
[15,14,12,16]
Output:[[15,13,2,5],
[14,3,4,1],
[12,6,8,9],
[16,7,10,11]]
解题思路:
方法一
借助额外数组存放旋转后的元素,旋转前的元素坐标为:(row,col),旋转后的元素坐标为:(col,n-1-row),即m(row,col)=m(col,n-1-row)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
public:
void rotatematrix(vector<vector<int>>& matrix){
if(matrix.empty())
return;
auto n=matrix.size();
vector<vector<int>> ans(n,vector<int>(n));
for(auto i=0;i<n;i++){
for(auto j=0;j<n;j++){
ans[j][n-1-i]=matrix[i][j];
}
}
copy(ans.begin(),ans.end(),matrix.begin());/*以追加的方式back_inserter*/
}
};
int main(int argc,char* argv[]){
vector<vector<int>> matrix={{1,2,3},{4,5,6},{7,8,9}};
Solution().rotatematrix(matrix);
for_each(matrix.begin(),matrix.end(),[](vector<int>& res){
cout<<"[ ";
for(auto& num:res)
cout<<num<<" ";
cout<<"]"<<endl;
});
return 0;
}
方法二
原地进行旋转操作,在前面得到的规律是:m(row,col)=m(col,n-1-row),因此先把m(col,n-1-row)临时存储到temp中,依次推进,得到循环.其中处于循环中:
m[row][col]; m[col][n-1-row]; m[n-1-row][n-1-col]; m[n-col-1][row];
需要确定枚举的位置,当n为偶数时,(n/2)*(n/2)=n^2/4个位置,可以保证不重不漏;n为奇数时,(n-1)/2*(n+1)/2=(n^2-1)/4个位置,可以做到不重不漏;
方法三
原地双百,核心思路是用翻转代替旋转,先以对角线为轴,进行翻转.再以每一行的中点为轴,进行翻转.
对角线翻转:
m[row][col]=m[col][row]
中心翻转:
m[row][col]=m[row][n-1-col]
package main
import "fmt"
func rotatematrix1(matrix [][]int){
if len(matrix)==0{
return
}
n:=len(matrix)
for row:=0;row<n/2;row++{
for col:=0;col<(n+1)/2;col++{
/*四个位置的元素进行互换*/
temp:=matrix[n-1-col][row]
matrix[n-1-col][row]=matrix[n-1-row][n-1-col]
matrix[n-1-row][n-1-col]=matrix[col][n-1-row]
matrix[col][n-1-row]=matrix[row][col]
matrix[row][col]=temp
}
}
}
func rotatematrix2(matrix [][]int){
if len(matrix)==0{
return
}
n:=len(matrix)
/*对角线翻转*/
for row:=0;row<n;row++{
for col:=row+1;col<n;col++{
temp:=matrix[row][col]
matrix[row][col]=matrix[col][row]
matrix[col][row]=temp
}
}
/*对每一行以中点进行翻转*/
for row:=0;row<n;row++{
for col:=0;col<n/2;col++{
temp:=matrix[row][col]
matrix[row][col]=matrix[row][n-1-col]
matrix[row][n-1-col]=temp
}
}
}
func main(){
fmt.Println("求旋转90度的矩阵")
matrix:=[][]int{{1,2,3},{4,5,6},{7,8,9}}
//rotatematrix1(matrix)
rotatematrix2(matrix)
fmt.Println(matrix)
}