程序员面试金典 1.7

Rotate Matrix:给定一个N * N的矩阵,将矩阵顺时针旋转90度。是否可以原地旋转呢?

最简单的方法就是由外到内按层进行旋转,将上面的转到右面,右面的转到下面,下面的转到左面,左面的转到上面。

可以把上面的一行先拷贝到一个临时空间中,然后依次把左面的一列拷贝到上面的一行,下面的一行拷贝到左面的一列,右面的一列拷贝到下面的一行,最后再将临时空间中的一行拷贝到右边的一列。这种方法需要额外的O(N)空间复杂度。

一种改进的方法是从外层到内层,逐个元素的进行旋转,当然也可以从内到外。

class Solution {
public:
    void rotate(vector<vector<int>> &matrix) {
        int iTmp = 0;
        size_t N = matrix.size();
        //无论N的奇偶,都需要旋转N / 2层,从第0层开始
        for(size_t layer = 0; layer < N / 2; layer++)
        {
            //每层旋转N - 1 - layer个元素,从第0个开始
            size_t first = layer, last = N - 1 - layer;
            for(size_t i = first; i < last; i++)
            {
                iTmp = matrix[layer][i];
                matrix[layer][i] = matrix[N - 1 - i][layer];//左->上
                matrix[N - 1 - i][layer] = matrix[N - 1 - layer][N - 1 - i];//下->左
                matrix[N - 1 - layer][N - 1 - i] = matrix[i][N - 1 - layer];//右->下
                matrix[i][N - 1 - layer] = iTmp;//上->右
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值