牛刀小试(01)——像素翻转

牛刀小试(01)——像素翻转

标签:牛刀小试

题目描述

有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。
测试样例:

[[1,2,3],[4,5,6],[7,8,9]],3

返回:

[[7,4,1],[8,5,2],[9,6,3]]

思路解析

  1. 该矩阵是一个N阶方阵,如果把矩阵想象为一个洋葱的话,那么在旋转的时候不同层的元素互不影响
  2. 同一层的元素在旋转过后,每一列/行其实还有一个元素原先还属于这一列/行,因为相邻的行和列之间有一个元素是相交的,该元素只是从行/列的最后一个元素变为第一个元素而已,所以每一行/列需要操作的元素总是:该行/列元素总数 - 1
  3. 顺时针旋转矩阵,实际上每层的元素却是按照逆时针的顺序来操作的
    牛刀小试(01)——像素翻转_第1张图片

代码解析

class Transform {
public:
    vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
        // i表示层数,j表示每层交换的位置
        int temp;
        for ( int i =0; i < n/2; i++ )//一共有n/2层
        {
            for ( int j = i; j < n-1-i; j++ )//每次移动某行或列同一位置元素
            {
                //始终记住i表示层与行,j表示某层某位置和列
                //分清楚行变化、列变化到底是i在变还是j在变,程序就不难写了
                temp = mat[i][j];
                mat[i][j] = mat[n-1-j][i];
                mat[n-1-j][i] = mat[n-1-i][n-1-j];
                mat[n-1-i][n-1-j] = mat[j][n-1-i];
                mat[j][n-1-i] = temp;
                //提示:最内层循环层数i一直没有变,变得只是j
            }
        }

        return mat;
    }
};

你可能感兴趣的:(算法)