刷题48. Rotate Image
一、题目说明
题目是48. Rotate Image,简而言之就是矩阵顺时针旋转90度。不允许使用额外的矩阵。
经过观察(写一个矩阵,多看几遍就知道了),旋转90度后:
第1行变为len-1列(最后一列),第i行变为 len-i-1列最终达到(i,j)-->(j,len-i-1)
知道规律后,做法就比较简单了,可以先上下行交换,再对角交换:
(i,j)-->(len-i-1,j)-->(j,len-i-1)
也可以先对角交换,再左右列交换:
(i,j)-->(j,i)-->(j,len-i-1)
二、我的做法
先上下行交换,再对角交换,(i,j)-->(len-i-1,j)-->(j,len-i-1),代码如下:
class Solution{
public:
void rotate(vector<vector<int>>& matrix){
//直接观察,第1行变为n-1列,第i行变为 len-i-1列
//最终达到(i,j)-->(j,len-i-1)
//可以: 先上下交换再对角交换 (i,j)-->(len-i-1,j)-->(j,len-i-1)
int temp,len = matrix.size();
for(int i = 0;i < len / 2;++i)
{
swap(matrix[i],matrix[len - 1 - i]);
}
for(int i = 0;i < len;++i)
{
for(int j = 0;j < i;++j)
{
swap(matrix[i][j],matrix[j][i]);
}
}
}
};
代码性能如下:
Runtime: 4 ms, faster than 83.46% of C++ online submissions for Rotate Image.
Memory Usage: 9.1 MB, less than 60.98% of C++ online submissions for Rotate Image.
三、优化措施
先对角交换,再左右列交换,(i,j)-->(j,i)-->(j,len-i-1),代码如下:
class Solution{
public:
void rotate(vector<vector<int>>& matrix){
//直接观察,第1行变为n-1列,第i行变为 len-i-1列
//最终达到(i,j)-->(j,len-i-1)
//可以: 先按斜对角线x=y交换,再按垂直中线左右交换
// (i,j)-->(j,i)-->(j,len-i-1)
int tmp;
int i,j,len=matrix.size();
for(i=0;i<len;i++){
for(j=i;j<len;j++){
tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
for(i=0; i<len; i++)
for(j=0; j<=(len-1)/2; j++){
tmp = matrix[i][j];
matrix[i][j] = matrix[i][len-1-j];
matrix[i][len-1-j] = tmp;
}
}
};
代码性能:
Runtime: 8 ms, faster than 17.16% of C++ online submissions for Rotate Image.
Memory Usage: 8.9 MB, less than 100.00% of C++ online submissions for Rotate Image.
刷题48. Rotate Image的更多相关文章
- leetcode刷题-48旋转图像
题目 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 思路 没有想到.看过解答后知道可以转置加翻转即可,且能达到最优的时间复杂度O(N^2). 实现 class Solu ...
- LeetCode数组刷题——448、48、240、769
1.[LeetCode448]:448. 找到所有数组中消失的数字 题目分析: 1-n之间有重复的,有没出现的,有出现一次.使用hashmap,空间复杂度为O(n) 方法一:哈希表,但是空间复杂度超过 ...
- Leetcode OJ 刷题
Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...
- leetcode 刷题记录(java)-持续更新
最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...
- LeetCode刷题总结-数组篇(中)
本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
- 手把手教你用C++ 写ACM自动刷题神器(冲入HDU首页)
转载注明原地址:http://blog.csdn.net/nk_test/article/details/49497017 少年,作为苦练ACM,通宵刷题的你 是不是想着有一天能够荣登各大OJ榜首,俯 ...
- leetcode刷题总结一
大四狗找工作,要刷题了,leetcode上面题目比较适合面试算法类题目,也不纯粹为了蒙题,锻炼一下面试类型的思维 Single Number: 有N个数,其中只有一个数出现了一次,其他都是两次,找出那 ...
- 【刷题记录】BZOJ-USACO
接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...
随机推荐
- Python dir和vars的区别
dir()和vars()的区别就是 dir()只打印属性(属性,属性......) 而vars()则打印属性与属性的值(属性:属性值......) ex. >> a='aaaaaaaaaa ...
- Dom4j 使用简介(全而好的文章)
版权声明:本文由冰云完成,首发于CSDN,未经许可,不得使用于任何商业用途.文中代码部分引用自DOM4J文档.欢迎转载,但请保持文章及版权声明完整.如需联络请发邮件:icecloud(AT)sina. ...
- 【Unity】鼠标划定范围然后截图~
有时候要重复用某一个场景的某一个角度,都过去好几步了结果总不能再把已经打乱的场景物体再移动回去吧.so~智慧的我完成了伟大的偷懒.截图保存,什么时候要看,直接上图片以假乱真棒棒哒~ 当然这个功能还能用 ...
- Java并发编程之并发简介
操作系统中同时执行多个程序原因: 1.资源利用率:系统资源及硬件资源.当一个程序再等待另一个程序时,可以运行另一个程序,可提高资源利用率. 2.公平性:多个程序对计算机上的资源理论上具有同等的使用权. ...
- 2-10 就业课(2.0)-oozie:2、介绍和安装1
oozie的安装及使用 1. oozie的介绍 Oozie是运行在hadoop平台上的一种工作流调度引擎,它可以用来调度与管理hadoop任务,如,MapReduce.Pig等.那么,对于Oozie ...
- Redis详解(五)——主从复制
Redis详解(五)--主从复制 面临问题 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的.而数据是最重要的,如果你不在乎,基本上也就不 ...
- idea-plugin-easycode
1.背景 在练习使用mybatis-generator时候,无意间看到博文esaycode(代码神器),https://www.jianshu.com/p/e4192d7c6844,试验完,感觉这个工 ...
- chrome警告:Synchronous XMLHttpRequest on the main thread
警告 原因 ajax同步请求会触发此警告 分析 这段英文翻译:主线程上的同步XMLHttpRequest不受欢迎,因为它对最终用户的体验有害: ajax同步,在向后台请求的过程中,前台代码执行会停留在 ...
- angularJS 服务
- Acwing199 余数之和
原题面:https://www.acwing.com/problem/content/201/ 题目大意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 ...