题解 | #顺时针旋转矩阵#
顺时针旋转矩阵
https://www.nowcoder.com/practice/2e95333fbdd4451395066957e24909cc
void ClockwiseMoseACircle(vector<vector<int> >& mat, int n, int start);
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param mat int整型vector<vector<>>
* @param n int整型
* @return int整型vector<vector<>>
*/
vector<vector<int> > rotateMatrix(vector<vector<int> >& mat, int n) {
// write code here
//总共需要旋转多少圈
int leftn = n;
int start = 0;
while(leftn>0)
{
for(int i=0; i<leftn-1; i++)
{
ClockwiseMoseACircle(mat, n, start);
}
leftn -= 2;
start++;
}
return mat;
}
};
//一些案例
/*
1--->1
1 2 3 1
3 4 ---> 4 2
1 2 3 4 1 2
4 5 6 7 5 3
7 8 9 ---> 8 9 6
1 2 3 4 13 9 5 1
5 6 7 8 14
9 10 11 12
13 14 15 16 -->
*/
//思路:先搞出来一圈,将一圈逆时针地置数
//start = 0; endX=n-1-start; endY=n-1-start;
void ClockwiseMoseACircle(vector<vector<int> >& mat, int n, int start)
{
int end = n-1-start;
if(start == end)
{
return;
}
int leave = mat[start][start];
//第一步:对于start 所在的列
for(int i=start; i<end; i++)
{
mat[i][start] = mat[i+1][start];
}
//第二步:对于end所在的行
for(int i=start; i<end; i++)
{
mat[end][i] = mat[end][i+1];
}
//第三步:对于end所在的列
for(int i=end; i>start; i--)
{
mat[i][end] = mat[i-1][end];
}
//第四步:对于start 所在的行
for(int i=end; i>start; i--)
{
if(i==start+1)
{
mat[start][i] = leave;
}
else {
mat[start][i] = mat[start][i-1];
}
}
}
查看3道真题和解析