当前位置: 首页 > news >正文

Rotate Image LeetCode

问题:

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up: 
Could you do this in-place?
 
分析:
二维数组a[n][n]顺时针旋转90度,要解决这个问题,无疑,第一件事儿就是找规律。
当n=1时,不用动了。
当n=2时,旋转之后有:
a[0][0] = a[1][0]
a[1][0] = a[1][1]
a[1][1] = a[0][1]
a[0][1] = a[0][0]
 
在这里我们初步总结规律为:a[i][j] = a[n-1-j][i]
当n=3时,旋转后显然也是满足上面的规律的
当n=4,5,……时也是满足的。
 
到这里,如果不考虑空间复杂的度的话,我们已经可以解决这个问题了,只需要再构建一个二维数组b[n][n],利用公式b[i][j] = a[n-1-j][i],就ok了,代码如下:
void rotate(vector<vector<int>>& matrix) {
    int n = matrix.size();
    vector<vector<int>> m;
    for (int row = 0; row < n; ++row) {
        for (int col = 0; col < n; ++col) {
            m[row][col] = matrix[n - 1 - col][row];
        }
    }
    //再赋值回matrix
    for (int row = 0; row < n; ++row) {
        for (int col = 0; col < n; ++col) {
            matrix[row][col] = m[row][col];
        }
    }
}
 
但是在这里,题目中也要求了,就在原数组中,应该怎么旋转?
接着上面的分析,以n=3为例
我们把焦点放在一个元素的旋转上,可以看出要在员数组中旋转,在不丢失数据的情况下,每个值的要旋转会“波及”4个数,以1为例波及到了1,3,7,9,每个数旋转要不丢失数据就要考虑如何让这个4个数都得以保留
前边总结了规律a[i][j] = a[n-1-j][i],分析每组被波及的数,我们可以得出这里波及的4了数其实就是
a[i][j]
a[n-1-j][i]
a[n-1-i][n-1-j]
a[n-1-(n-1-j)][n-1-i]=a[j][n-1-i]
所以这里需要引入一个临时变量temp就可以解决这4个数的顺时针交换,如:
int temp = matrix[i][j];
matrix[i][j] = matrix[n-1-j][i];
matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
matrix[j][n-1-i] = temp;
把焦点放在一个元素上,数交换的问题解决了,
那么现在我们把焦点回到整个二维数组上来,每个数的旋转会波及4个数,相当于用上面的方法,每旋转一个数,就把一组的4个数都旋转了,
所以现在的问题就是如何才能完整的把所有的数都旋转90度且不会多旋转,继续分析吧,
n=1时,不需旋转。
n=2时,只需要完成1(a[0][0])的旋转,就完成了整个数组的旋转。
n=3时,需要完成1,2(a[0][0],a[0][1])的旋转,就完成了整个数组的旋转
n=4时,需要完成1,2,3,6(a[0][0至3],a[1][1])的旋转
n=5时,需要完成(a[0][0至4],a[1][1至2])
 
大致可以总结出这么一个规律:
对于要旋转的数a[i][j]满足,
i<n/2 且 i<=j<n-1-i
至此问题终于完美解决了。。
代码如下:
void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int limit = (n - 1) >> 1;
        for(int i = 0; i <= limit; ++i){
            for(int j = i; j < n - 1 - i; ++j){
                int temp                =   matrix[i][j];
                matrix[i][j]            =   matrix[n-1-j][i];
                matrix[n-1-j][i]        =   matrix[n-1-i][n-1-j];
                matrix[n-1-i][n-1-j]    =   matrix[j][n-1-i];
                matrix[j][n-1-i]        =   temp;
            }
        }
    }

 

转载于:https://www.cnblogs.com/sdlwlxf/p/5094628.html

相关文章:

  • MFC消息映射与命令传递
  • CentOS6.6下解压安装mysql-5.7.10-linux-glibc2.5-i686.tar.gz
  • myeclipse安装插件phpeclipse后进行PHP代码编写
  • 怎样选择前端框架
  • 【遇到的问题】父div不能被撑开
  • iOS开发-UIView扩展CGRect
  • 如何使用 SPICE client (virt-viewer) 来连接远程虚拟机桌面?
  • openssh 加固
  • Spring MVC 拦截器 interceptors
  • Javascript继承机制的实现
  • AndroidTestCase简单使用
  • Linux开源文本编辑器培训教材(二)
  • 微信公众平台开发(111) 现金红包、裂变红包、企业付款
  • ListView和SimPleteAdapter 把新闻数据绑定到ListView
  • I.MX6 Linux udev porting
  • [译]如何构建服务器端web组件,为何要构建?
  • 10个确保微服务与容器安全的最佳实践
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • git 常用命令
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript对象详解
  • oldjun 检测网站的经验
  • oschina
  • web标准化(下)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 记录一下第一次使用npm
  • 开源SQL-on-Hadoop系统一览
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何优雅地使用 Sublime Text
  • 新手搭建网站的主要流程
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • Java数据解析之JSON
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #define用法
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)jQuery 基础
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)Oracle存储过程编写经验和优化措施
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .NET 4.0中的泛型协变和反变
  • .NET Core 版本不支持的问题
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Project Open Day(2011.11.13)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • /proc/stat文件详解(翻译)
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...