您的位置:首页 > 其它

像素翻转

2016-03-01 09:37 363 查看

题目描述

有一副由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]]

解答

  要将矩阵顺时针旋转90度,最简单的做法就是一层一层进行旋转。对每一层进行环状旋转,将上边移到右边,右边移到下边,下边移到左边,左边移到上边。

  


  

  如何进行环状旋转?

  暴力法就是将上边复制到一个数组中,然后将左边移到上边,下边移到左边。这样做需要O(n)的内存空间。

  更好的做法是按索引一个一个进行交换。

  

for i=0 to n
tmp = top[i]
top[i] = left[i]
left[i] = bottom[i]
bottom[i] = right[i]
right[i] = tmp


  从最外面一层开始逐渐往里,在每一层上执行上述交换。注意索引的控制。

  

class Transform {
public:
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
// write code here
for(int row = 0;row<n/2;++row)
{
int first = row;
int last = n-1-row;
for(int i = first;i<last;++i)
{
int offset = i-first;

int topLeft = mat[first][i];

mat[first][i] = mat[last-offset][first];

mat[last-offset][first] = mat[last][last-offset];

mat[last][last-offset] = mat[i][last];

mat[i][last] = topLeft;
}
}

return mat;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: