leetcode笔记:Rotate Image
2015-09-10 17:26
381 查看
一.题目描述
You are given an
Rotate the image by 90 degrees (clockwise).
Follow up: Could you do this in-place?
二.题目分析
由于要求将图像顺时针旋转90度,最简单的做法就是画个图出来观察旋转90度之后的图像的情况,经过分析可知,顺时针旋转90度就是将原来的图像的最后一行作为第一列,倒数第二行作为第二列,因此类推,第一行作为最后一列。如果不考虑in-place条件,我们可以创建一个大小为
但是,题目希望能in-place进行,由于无论图像进行什么角度的选择,左上角的点都可以看作坐标系的原点,因此,将一幅图像抽象成
1 2 3
4 5 6
7 8 9
顺时针旋转90度之后的图像的抽象即为:
7 4 1
8 5 2
9 6 3
可以归纳出一种等价的变换:
首先,将矩阵的每个元素沿着沿着主对角线进行交换;
1 2 3 — 1 4 7
4 5 6 -> 2 5 8
7 8 9 — 3 6 9
然后,每列的元素沿着水平中线对称翻转一次,在这里,第一列和第三列关于第二列对称,因此只需将一、三列元素对调,即可得到旋转90度后的结果。
1 4 7 — 7 4 1
2 5 8 -> 8 5 2
3 6 9 — 9 6 3
三.示例代码:
一个测试结果:
四.小结
这道题要求in-place运算,其实对于此类要求,应该更多考虑转换前后数据/矩阵的关系。根据以上的分析我们知道,将一张图片进行顺时针90度旋转,可等价于将矩阵的每个元素沿着沿着主对角线进行交换,然后沿着水平中线翻转一次,或者先将矩阵元素沿着水平中线翻转一次,然后再沿对角线交换,这样可以做到in-place运行,空间复杂度为
You are given an
n×n2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up: Could you do this in-place?
二.题目分析
由于要求将图像顺时针旋转90度,最简单的做法就是画个图出来观察旋转90度之后的图像的情况,经过分析可知,顺时针旋转90度就是将原来的图像的最后一行作为第一列,倒数第二行作为第二列,因此类推,第一行作为最后一列。如果不考虑in-place条件,我们可以创建一个大小为
n×n的一个二维数组来进行复制操作,然后将旋转后的图像拷贝回原来的图像中。这种做法的时间复杂度为
O(n^2),空间复杂度为
O(n^2)。
但是,题目希望能in-place进行,由于无论图像进行什么角度的选择,左上角的点都可以看作坐标系的原点,因此,将一幅图像抽象成
3×3的情形,可以从中找出一些规律:
1 2 3
4 5 6
7 8 9
顺时针旋转90度之后的图像的抽象即为:
7 4 1
8 5 2
9 6 3
可以归纳出一种等价的变换:
首先,将矩阵的每个元素沿着沿着主对角线进行交换;
1 2 3 — 1 4 7
4 5 6 -> 2 5 8
7 8 9 — 3 6 9
然后,每列的元素沿着水平中线对称翻转一次,在这里,第一列和第三列关于第二列对称,因此只需将一、三列元素对调,即可得到旋转90度后的结果。
1 4 7 — 7 4 1
2 5 8 -> 8 5 2
3 6 9 — 9 6 3
三.示例代码:
#include <iostream> #include <vector> using namespace std; class Solution { public: void turnRightImage(vector<vector<int> >& image) { int imaSize = image.size(); // 主对角线以下的元素与主对角线上元素沿着主对角线垂直方向对换 for (int i = 1; i < imaSize; i++) { for (int j = i - 1; j >= 0; j--) swap(image[i][j], image[j][i]); } for (int k = 0; k < imaSize / 2; k++) { for (int l = 0; l < imaSize; l++) swap(image[l][k], image[l][imaSize - k - 1]); } } };
一个测试结果:
四.小结
这道题要求in-place运算,其实对于此类要求,应该更多考虑转换前后数据/矩阵的关系。根据以上的分析我们知道,将一张图片进行顺时针90度旋转,可等价于将矩阵的每个元素沿着沿着主对角线进行交换,然后沿着水平中线翻转一次,或者先将矩阵元素沿着水平中线翻转一次,然后再沿对角线交换,这样可以做到in-place运行,空间复杂度为
O(1)。
相关文章推荐
- C++Primer第五版 1.4.1节练习
- 反射——根据get返回类型set值
- ORACLE时间精确到毫秒
- GUI架构方法
- Android RecyclerView 使用完全解析 体验艺术般的控件
- 小笔记 使android界面打开时EditText不自动获得焦点
- 压缩感知(Compressive Sensing)学习之(二)
- Dos的For命令批量修改文件后缀名
- IOS应用内购买(In App Purchase)总结
- Step4:SQL Server 跨网段(跨机房)复制
- Eclipse下svn的创建分支/合并/切换使用
- 自定义控件 --- 加载旋转图标
- php缓存技术
- 深入理解C++编程中的局部变量和全局变量
- 动态规划之背包问题(一)
- 十张图告诉你昨夜苹果都发布了什么新产品
- Next Permutation
- Android与服务器端数据交互
- ios微信web登录,QQweb登录中遇到的坑
- Java中getResourceAsStream的用法