一、题目说明

题目是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的更多相关文章

  1. leetcode刷题-48旋转图像

    题目 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 思路 没有想到.看过解答后知道可以转置加翻转即可,且能达到最优的时间复杂度O(N^2). 实现 class Solu ...

  2. LeetCode数组刷题——448、48、240、769

    1.[LeetCode448]:448. 找到所有数组中消失的数字 题目分析: 1-n之间有重复的,有没出现的,有出现一次.使用hashmap,空间复杂度为O(n) 方法一:哈希表,但是空间复杂度超过 ...

  3. Leetcode OJ 刷题

    Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...

  4. leetcode 刷题记录(java)-持续更新

    最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...

  5. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  6. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  7. 手把手教你用C++ 写ACM自动刷题神器(冲入HDU首页)

    转载注明原地址:http://blog.csdn.net/nk_test/article/details/49497017 少年,作为苦练ACM,通宵刷题的你 是不是想着有一天能够荣登各大OJ榜首,俯 ...

  8. leetcode刷题总结一

    大四狗找工作,要刷题了,leetcode上面题目比较适合面试算法类题目,也不纯粹为了蒙题,锻炼一下面试类型的思维 Single Number: 有N个数,其中只有一个数出现了一次,其他都是两次,找出那 ...

  9. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

随机推荐

  1. Python集合语法

    a = {1,2,3,4,5,6,7,8,"aa","2"}    b = {2,3,4,5,6,7,8,9,99,7,6,6} v = a.intersect ...

  2. 数据归一化Scaler-机器学习算法

    //2019.08.03下午#机器学习算法的数据归一化(feature scaling)1.数据归一化的必要性:对于机器学习算法的基础训练数据,由于数据类型的不同,其单位及其量纲也是不一样的,而也正是 ...

  3. 吴裕雄--天生自然JAVA数据库编程:ResultSet接口

    import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...

  4. 2017北京网络赛 F Secret Poems 蛇形回路输出

    #1632 : Secret Poems 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The Yongzheng Emperor (13 December 1678 – ...

  5. 使用 Visual Studio Code 进行 Laravel 开发(转)

    转自:https://laravelacademy.org/post/8016.html 关于 Laravel 代码开发工具大家各有所好,大部分应该在用 PHPStorm,Sublime 也有很多粉丝 ...

  6. Python基础week2

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  7. windows目标进程注入dll

    在别的程序注入dll 步骤: ,获取目标进程ID,CreateToolhelp32Snapshot()函数; ,获取目标进程句柄,OpenProcess()函数; ,目标进程要一块内存,Virtual ...

  8. 运行jar包中的main方法

    java -classpath jar包名.jar 包名.类名

  9. H7-TOOL脱机烧录器功能开源发布

    H7-TOOL汇总帖:https://www.cnblogs.com/armfly/p/12283459.html 当前已经对STM32F030,STM32F103,STM32F429,STM32F7 ...

  10. Java提升三:函数式接口

    1. 定义 函数式接口即是有且仅有一个抽象方法的接口. 注意: (1)函数式接口只对于抽象方法有要求,对于接口中的默认方法,静态方法,私有方法数量并不作特殊要求. (2)既然函数式接口定义了抽象方法, ...