1.7 旋转矩阵

     《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及这里: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),这里只用到了一个临时变量。

 
图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;

}
 
图2.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqssss121dfd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值