题目描述

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

作者:力扣 (LeetCode)

链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnhhkv/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

题目解析

例,输入输出如下图:

这个题目与其说是一道算法题,不如说是一道找规律得题目,我们怎样才能实现图像得90度旋转呢?通过对比输入输出图中数字得位置可以发现:我们可以将第一列得4个数通过顺时针旋转到第一行上,第一行顺时针旋转到最后一列上,一次类推;内圈的数字也要如此旋转,就可以完成题目要求,如下图:

有了思路之后,我们怎么通过算法实现呢?那就是找规律了。

首先,我们以数字5为例,看一下它以及和他有关的数字的变化路径:5->11 11->16 16->15 15->5;

其次,我们继续找规律,我们将上述数字集合线标来一遍:

  • 5(0,0)->11(0,3)

  • 11(0,3)->16(3,3)

  • 16(3,3)->15(3,0)

  • 15(3,0)->5(0,0)

从下标中我们能够发现有重复的下标相互转换数字,那么他们其中有什么内在的连续呢?我们现在找规律已经使用了数字转换流程,数字的下标,仔细想一下我们是不是还有一个关键的变量没有用到,那就是n*n;

最后,我们加上二维数组的行列长度再来一遍:

  • 5([i]:0,[j]:0)->11([i]:0,[n-i或者j-1]:3)

  • 11()

写到第二条的时候我发现写不下去了,这里的下标有大量的0和3,没有办法分辨是i还是j,写出来的规律也不能通用,因此我决定用数字1及其相关的数字类找规律(i=0,j=1)

首先,

  • 1->10

  • 10->12

  • 12->13

  • 13->1

其次,

  • 1(0,1)->10(1,3)

  • 10(1,3)->12(3,2)

  • 12(3,2)->13(2,0)

  • 13(2,0)->(0,1)

最后,

  • 1([i]:0,[j]:1)->10([j]:1,[n-i-1]:3)

  • 10([j]:1,[n-i-1]:3)->12([n-i-1]:3,[n-j-1]:2)

  • 12([n-i-1]:3,[n-j-1]:2)->13([n-j-1]:2,[i]:0)

  • 13([n-j-1]:2,[i]:0)->1([i]:0,[j]:1)

我们找到一下通用变量,有兴趣的可以套一下数字9及其相关数字的规律:

令:int m=n-i-1,c=n-j-1。

如下图示:

 

题目解答

算法1,时间复杂度为 o(n²),直接上代码如下:

class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int row=matrix.size();
int colunm=matrix[0].size();
int length=row/2;
for(int i=0;i<length;i++)
{
for(int j=i;j<colunm-i-1;j++)
{
int m=row-i-1;
int n=row-j-1;
int temp=matrix[i][j];
matrix[i][j]=matrix[n][i];
matrix[n][i]=matrix[m][n];
matrix[m][n]=matrix[j][m];
matrix[j][m]=temp;
}
}
}
};

解题思路:解题思路再题目分析中已经详细阐明,此次不再累述。

LeetCode:旋转图像的更多相关文章

  1. LeetCode:旋转图像【48】

    LeetCode:旋转图像[48] 题目描述 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使 ...

  2. 前端与算法 leetcode 48. 旋转图像

    目录 # 前端与算法 leetcode 48. 旋转图像 题目描述 概要 提示 解析 解法一:转置加翻转 解法二:在单次循环中旋转 4 个矩形 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  3. LeetCode——48. 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  4. LeetCode初级算法之数组:48 旋转图像

    旋转图像 题目地址:https://leetcode-cn.com/problems/rotate-image/ 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: ...

  5. [LeetCode] Rotate Image 旋转图像

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  6. LeetCode 48. Rotate Image(旋转图像)

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  7. python(leetcode)-48旋转图像

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  8. LeetCode(48):旋转图像

    Medium! 题目描述: 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转 ...

  9. Leetcode题库——48.旋转图像

    @author: ZZQ @software: PyCharm @file: rotate.py @time: 2018/11/16 15:41 要求:给定一个 n × n 的二维矩阵表示一个图像.将 ...

随机推荐

  1. vs2010中release模式下调试程序

    debug模式调试信息全,但是速度很慢,在数据量比较大的时候非常影响调试效率,release模式速度快,但是没有调试信息.所以在编译的时候很多编译器会提供一种折中的编译方式,在release下提供调试 ...

  2. STM32核心板焊接

    焊接工具和材料 电烙铁及烙铁头介绍 电烙铁有很多种,常用的有内热式.外热式.恒温式和吸锡式,为了方便携带,建议使内热式电烙铁,且要带烙铁架和海绵,烙铁架用于放置电烙铁,海绵用于擦拭烙铁锡渣,因此海绵不 ...

  3. series和读取外部数据

    1.为什么学习pandas 我们并不是不愿意学习新的知识,只是在学习之前我们更想知道学习他们能够帮助我们解决什么问题.--伟哥 numpy虽然能够帮助我们处理数值,但是pandas除了处理数值之外(基 ...

  4. Linkerd 2:5 分种厘清 Service Mesh 相关术语

    API Gateway(API 网关) API gateway 位于应用程序的前面,旨在解决身份验证和授权.速率限制以及为外部消费者提供公共访问点等业务问题. 相比之下,service mesh 专注 ...

  5. Spring Cloud Gateway夺命连环10问?

    大家好,我是不才陈某~ 最近有很多小伙伴私信我催更 <Spring Cloud 进阶>,陈某也总结了一下,最终原因就是陈某之前力求一篇文章将一个组件重要知识点讲透,这样导致了文章篇幅很长, ...

  6. hdu 3199 Hamming Problem(构造?枚举?)

    题意: For each three prime numbers p1, p2 and p3, let's define Hamming sequence Hi(p1, p2, p3), i=1, . ...

  7. docker 简单总结

    一.docker 安装 yum 方式在centos和rhce上的安装条件: 要安装Docker引擎,你需要一个维护版本的CentOS 7或8.不支持或测试存档版本.必须启用centos-extras存 ...

  8. 组件通过props属性传值

    组件之间的传值 组件是一个单独功能模块的封装,有属于自己的data和methods,一个组件的 data 选项必须是一个函数 为什么必须是函数:因为只有当data是函数时,不同实例调用同一个组件时才会 ...

  9. OOP 4.21晚 指针知识点

    1.读法:int* ptr ptr是一个指针指向整型变量 2.指针类型:指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型; 3.指针所指向的类型:只须把指针声明语句中的指针名字和名字左边的指 ...

  10. Mac 下 Nginx 配置使用

    安装 homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/m ...