旋转图像

简介:

v旋转图像

  给定一个N×N的二维矩阵表示图像,90度顺时针旋转图像。

v看个例子

          

v算法1:

  如上图所示,设一个N阶二维矩阵,则将矩阵从外向里可以分成N/2个圈,例如(1 2 3 4 8 12 16 15 14 13 9 5)这是最外边的圈,设圈的维度是n(最外圈有n=N=4),而(6 7 11 10)这是里边的一个圈(n=2), 旋转90度之后,每个数字是按照顺时针的方向移动了n-1个位置。

v找到数字该去的位置:

复制代码
pair<int, int> getNextPos(int i, int j, int top, int left, int down, int right){
        //(top, left) (down, right)标示这个圈的范围,即左上角坐标和右下角坐标
        int n = down-top+1;//得到这个圈的维度
        int move = n-1;//转过move个位置
        while(move--){
            if(i==top && j>=left && j<right)
                ++j;
            else if(i>=top && i<down && j==right)
                ++i;
            else if(i==down && j<=right && j>left)
                --j;
            else if(i<=down && i>top && j==left)
                --i;
        }
        return make_pair(i, j);
}
复制代码

v旋转过程:

  由上图可见,1到4的位置,4到16的位置,16到13的位置,13到1的位置,结束循环。接着数字2和数字3按照同样的步骤,完成了整个圈的旋转操作。

复制代码
void rotate(vector<vector<int> > &matrix) {
        // write your code here
        //方法1:转圈法,从外圈到里圈,设圈的维度是n,图像旋转90度后,数字顺时针移动n-1个位置
        int circle = matrix.size()/2;//得到圈的个数
        int top=0, left=0, down=matrix.size()-1, right=matrix.size()-1;//最外圈的维度
        for(int cir=0; cir<circle; ++cir){
            int ttop = top+cir;
            int lleft = left+cir;
            int rright = right-cir;
            int ddown = down-cir;
//(ttop, lleft) (ddown, rright)标示这个圈
for(int j=lleft; j<rright; ++j){ pair<int, int> org = make_pair(ttop, j);//原始位置,如果再次到这个位置,说明交换完毕 pair<int, int> cur = org; int cur_val = matrix[cur.first][cur.second];//当前数的值 while(true){ pair<int, int> _next = getNextPos(cur.first, cur.second, ttop, lleft, ddown, rright); swap(matrix[_next.first][_next.second], cur_val); if(_next==org) break; cur = _next; } } }
}
复制代码

v算法2:

  通过两次折叠,先上下对换,再根据对角线对换,即可得到目标图像。

复制代码
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-i-1][j]);//上下对换
        for(int i=0; i<n; ++i)
            for(int j=0; j<i; ++j)
                swap(matrix[i][j], matrix[j][i]);//主对角线两侧交换
}
复制代码

 

v题目链接:

  http://www.lintcode.com/zh-cn/problem/rotate-image/

目录
相关文章
|
6月前
|
机器学习/深度学习
leetcode-48:旋转图像
leetcode-48:旋转图像
45 0
|
21天前
|
机器学习/深度学习
Leetcode第48题(旋转图像)
这篇文章介绍了LeetCode第48题“旋转图像”的解题方法,通过原地修改二维矩阵实现图像的顺时针旋转90度。
25 0
Leetcode第48题(旋转图像)
|
3月前
|
存储 算法
LeetCode第48题旋转图像
LeetCode第48题"旋转图像"的解题方法,通过两次翻转操作——先水平翻转再对角线翻转,实现了原地旋转矩阵的效果。
LeetCode第48题旋转图像
|
5月前
|
存储 Cloud Native Linux
OpenCV图像翻转和旋转
OpenCV图像翻转和旋转
|
5月前
|
算法 Python
扭曲图像 鼻子拉伸
【6月更文挑战第28天】
26 0
|
6月前
|
计算机视觉
翻转图像
【5月更文挑战第12天】翻转图像。
79 6
|
6月前
|
算法 计算机视觉
缩放图像
【5月更文挑战第12天】缩放图像。
43 5
|
机器学习/深度学习
旋转图像1
旋转图像1
80 0
四元数与三维旋转
四元数与三维旋转
147 0
四元数与三维旋转
|
机器学习/深度学习
LeetCode 48. 旋转图像
给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。
88 0