CC06:像素翻转
题目
有一副由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表示:
1 2 3 7 4 1
4 5 6---------> 8 5 2 // 第二行就是第一行+1
7 8 9 9 6 3
class Transform {
public:
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
// write code here
int temp=mat[0][0];
for(int i=0;i<n;i++)
{
if(n-1-i==0)
mat[0][i]=temp;
else
mat[0][i]=mat[n-i-1][0];
}
for(int i=1;i<n;i++)
{
for(int j=0;j<n;j++)
{
mat[i][j]=mat[i-1][j]+1;
}
}
return mat;
}
};
先在原来代码上进行修补,加一个缓存矩阵后是能AC的,代码如下:
class Transform {
public:
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
// write code here
res=mat;
for(int j=0;j<n;j++)
{
for(int i=0;i<n;i++)
{
if(n-1-i==0&&j==0)
mat[j][i]=res[0][0];
else
mat[j][i]=res[n-i-1][j];
}
}
return mat;
}
private:
vector<vector<int>> res;
};
但是题目要求的是"原地算法",所以需要更换算法,网上的代码如下:
public int[][] transformImage(int[][] mat, int n) {
for (int layer = 0; layer < n / 2; ++layer) {
int first = layer;
int last = n - 1 - layer;
for (int i = first; i < last; ++i) {
int offset = i - first;
// 存储上边
int top = 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] = top;
}
}
return mat;
}
这个代码就很有意思,主要考虑了偏移量以及只用操作一半的矩阵就OK了。操作原理就是考虑矩阵的四个角落位置,然后加上偏移量继续变换,一层一层地往里面变换。
CC06:像素翻转的更多相关文章
- 算法题 18 像素翻转 牛客网 CC150
算法题 18 像素翻转 牛客网 CC150_P114 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时 ...
- 二刷Cracking the Coding Interview(CC150第五版)
第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...
- Windows GDI绘图基础知识
一.Windows可以画直线.椭圆线(椭圆圆周上的曲线)和贝塞尔曲线.////////////7 个画线函式是:(1)画直线LineTo BOOL LineTo(HDC hdc,int nXEn ...
- Opencv 最小外接矩形合并拼接
前一篇画出了最小外接矩形,但是有时候画出来的矩形由于中间像素干扰或者是其他原因矩形框并不是真正想要的 如图1是一个信号的雨图,被矩形框分割成了多个小框: 需要合并矩形框达到的效果: 主要思想: 扫描两 ...
- CSS3图片翻转切换案例及其中重要属性解析
图片翻转切换,在不使用CSS3的情况下,一般都是使用JS实现动画,同时操作元素的width和left,或者height和top以模拟翻转的效果,并在适当时候改变src或者z-index实现图片切换. ...
- 自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)
using System; using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; na ...
- 【WP 8.1开发】如何处理摄像头翻转的问题
模拟器就像我们儿时的梦境,在其上运行应用程序时,一切总是那么美好的:而真机测试如同我们这个纷乱无章的现实世界,你会遇到各种小人和畜生,常常会遭受莫名的挫折.面对挫折,有人迎难而上,或不予理采,走自己的 ...
- 【译】仿Taasky的3D翻转菜单动画实现
最终效果 最终效果 开始 首先下载并打开一个事先搭好架子的Demo,然后来分析一下.这个Demo包含一个主页和详情页,其中MenuViewController继承自UITableViewControl ...
- C#中的bitmap类和图像像素值获取方法
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
随机推荐
- python3 - 写一个生成双色球号码的一个程序,生成的号码写到文件里面
写一个生成双色球号码的一个程序,生成的号码写到文件里面 # 中奖号码由6个红色球号码和1个蓝色球号码组成 # 篮球范围:01-16 # 红球范围:01-33 def swq(num): random. ...
- Linux_服务器_06_VMware虚拟机下安装CentOS7.0图文教程
二.参考资料 1.VMware虚拟机下安装CentOS7.0图文教程
- Listen 82
Doc Calls Deconditioning a Condition Doctors know a lot about prescribing medications. "Take tw ...
- ACM学习历程—ZOJ 3861 Valid Pattern Lock(dfs)
Description Pattern lock security is generally used in Android handsets instead of a password. The p ...
- T(n) = 25T(n/5)+n^2的时间复杂度
对于T(n) = a*T(n/b)+c*n^k;T(1) = c 这样的递归关系,有这样的结论: if (a > b^k) T(n) = O(n^(logb(a)));logb(a)b为底a ...
- 微信接口出现“调用支付jsapi缺少参数appid”
微信接口出现“调用支付jsapi缺少参数appid” 注意:@Html.Raw(ViewBag.wxJsApiParam),//json串ViewBag.wxJsApiParam是一个在后台拼的一个j ...
- PDF,IMAGE,HTML,WORD,EXCEL 互操作
http://www.cnblogs.com/lyl6796910/p/3318056.html
- 如何查看Mysql event事件是否启用
mysql> show variables like 'event_scheduler';+-----------------+-------+| Variable_name | Value ...
- L2-013. 红色警报 (并查集)
战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不 ...
- DP专题
最全DP总结 https://blog.csdn.net/cc_again/article/details/25866971 ACM题集 https://blog.csdn.net/liuqiyao_ ...