方形矩阵顺时针旋转90度 Rotate Image
2013-11-26 13:29
453 查看
原地变形问题。
题目:You are given an n x n 2D
matrix representing an image.Rotate the image by 90 degrees (clockwise).要求,原地进行,空间复杂度为O(1)。
思路一:直观地去旋转。观察规律就知道把每个点A[i][j]放到A[j][n-1-j]去。为了节省空间,我必须连着串有序的挨个把原位置换到新位置。规律显示这样都是四个点一组,组内只要旋转的传递一圈即可,只需要加一个tmp就能完成循环传递。那么对于整个矩阵,有多少个这样的一组四个点?
观察发现从0,0点开始,是最外圈,最外圈的组有n-1个。逐步往里,每往里一圈,组的个数就减少2个(对称的),内圈的组越来越少。直到最里面的一圈只有一组4个点,或者只有1个点。
一个组四个点循环传递即可,即要把A[n-1-j][i]放到A[i][j]中去。
该方法的时间复杂度为O(N*N)。
思路二:有技巧地翻转。首先沿着中间水平线做对称翻转,然后沿着主对角线做对称翻转。(也可以先沿着副对角线对称翻转,再沿着水平中线对称翻转)。
class Solution {
public:
void rotate(vector<vector<int> > &matrix) {
int n = matrix.size();
// 沿着水平中线翻转
for(int i=0;i<n/2;i++)
for(int j=0;j<n;j++)
swap(matrix[i][j], matrix[n-1-i][j]);
// 沿着主对角线翻转
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
swap(matrix[i][j], matrix[j][i]);
}
};
题目:You are given an n x n 2D
matrix representing an image.Rotate the image by 90 degrees (clockwise).要求,原地进行,空间复杂度为O(1)。
思路一:直观地去旋转。观察规律就知道把每个点A[i][j]放到A[j][n-1-j]去。为了节省空间,我必须连着串有序的挨个把原位置换到新位置。规律显示这样都是四个点一组,组内只要旋转的传递一圈即可,只需要加一个tmp就能完成循环传递。那么对于整个矩阵,有多少个这样的一组四个点?
观察发现从0,0点开始,是最外圈,最外圈的组有n-1个。逐步往里,每往里一圈,组的个数就减少2个(对称的),内圈的组越来越少。直到最里面的一圈只有一组4个点,或者只有1个点。
一个组四个点循环传递即可,即要把A[n-1-j][i]放到A[i][j]中去。
该方法的时间复杂度为O(N*N)。
class Solution { public: void rotate(vector<vector<int> > &matrix) { int n = matrix.size(); if (n <= 0) return; int i, j, k, tmp, temp; for(i=0; i<=(n-1)/2; i++) //i从0到(n-1)/2 for(j=i; j<=n-2-i; j++) //j从i到n-2-i { tmp = matrix[i][j]; for(k=0;k<3;k++) { matrix[i][j] = matrix[n-1-j][i]; temp = i; i = n-1-j; j = temp; } matrix[i][j] = tmp; temp = i; //第四次能得把i,j更新回开始的值 i = n-1-j; j = temp; } } };
思路二:有技巧地翻转。首先沿着中间水平线做对称翻转,然后沿着主对角线做对称翻转。(也可以先沿着副对角线对称翻转,再沿着水平中线对称翻转)。
class Solution {
public:
void rotate(vector<vector<int> > &matrix) {
int n = matrix.size();
// 沿着水平中线翻转
for(int i=0;i<n/2;i++)
for(int j=0;j<n;j++)
swap(matrix[i][j], matrix[n-1-i][j]);
// 沿着主对角线翻转
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
swap(matrix[i][j], matrix[j][i]);
}
};
相关文章推荐
- LeetCode-----48. Rotate Image(二维矩阵旋转90度)
- [LeetCode] Rotate Image n-by-n矩阵顺时针旋转
- LeetCode——Rotate Image(二维数组顺时针旋转90度)
- LeetCode——Rotate Image(二维数组顺时针旋转90度)
- Rotate Image 矩阵旋转90度,没有额外空间
- Arrays_Strings 90度顺时针逆时针旋转方形矩阵 @CareerCup
- [leetcode 48] Rotate Image--------矩阵旋转90度
- 【旋转矩阵】Rotate Image
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
- 【数组】将N*N的int类型矩阵顺时针旋转90度
- 矩阵顺时针旋转90度
- JAVA代码—算法基础:将N*N的矩阵顺时针旋转90度输出元素
- 2015创发科技校园招聘笔试题——把矩阵顺时针旋转90度
- Arithmetic problem | 在原地顺时针90度旋转矩阵图像
- LeetCode Rotate Image(矩阵的旋转)
- 矩阵顺时针旋转90度
- LeetCode-48-Rotate Image 矩阵旋转90
- [LeetCode]—Rotate Image 矩阵90度翻转
- Rotate Image 二维数组旋转90度
- LeetCode-Rotate Image-图像旋转-矩阵元素操作