《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及这里:https://github.com/alexhagiopol/cracking-the-coding-interview
void rotateMatrix(vector<vector<int>> & inputMatrix)
{
int n=inputMatrix.size();
for(int layer=0; layer<n/2; layer++)
{
int layerLastIndex=n-1-layer;
for(int j=layer; j<layerLastIndex; j++)
{
int temp=inputMatrix[layer][j];
inputMatrix[layer][j]=inputMatrix[n-1-j][layer]; /*Left-> Top*/
inputMatrix[n-1-j][layer]=inputMatrix[layerLastIndex][n-1-j];/*Bottom-> Left*/
inputMatrix[layerLastIndex][n-1-j]=inputMatrix[j][layerLastIndex];/*Right->Bottom*/
inputMatrix[j][layerLastIndex]=temp;/*Top->Right*/
}
}
}
这段代码还参考了这里https://blog.csdn.net/woliuyunyicai/article/details/49383033。这里考虑的是对N×N矩阵的顺时针旋转。算法过程为遍历矩阵从外到里的每一层,对于特定的一层,将该层左边的元素替换上边的元素,下边的元素替换左边的元素,右边的元素替换下边的元素,上边的元素替换右边的额元素。4×4矩阵的替换过程如下图1所示。该算法的时间复杂度为O( N 2 N^2 N2)。算法的空间复杂度为O(1),这里只用到了一个临时变量。
//测试程序,结果如图二所示。//
int main()
{
vector<vector<int>> matrix(4);
for (int i = 0; i < 4; i++)
{
matrix[i].resize(4);
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j< 4; j++)
{
matrix[i][j]=(i+1)*(j+1);
}
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
cout<<matrix[i][j]<<" ";
}
cout << endl;
}
rotateMatrix(matrix);
cout << endl;
cout << "///";
cout << endl;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
return 0;
}