问题:

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了,代码如下:

  1. public void rotate(int[][] matrix) {
  2. int n = matrix.length;
  3. int[][] m = new int[n][n];
  4. for(int row=0;row<n;row++){
  5. for(int col=0;col<n;col++){
  6. m[row][col] = matrix[n-1-col][row];
  7. }
  8. }
  9. //再赋值回matrix,注意java是形参是引用传递
  10. for(int row=0;row<n;row++){
  11. for(int col=0;col<n;col++){
  12. matrix[row][col] = m[row][col];
  13. }
  14. }
  15. }

 

但是在这里,题目中也要求了,就在原数组中,应该怎么旋转?

接着上面的分析,以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个数的顺时针交换,如:

  1. int temp = matrix[i][j];
  2. matrix[i][j] = matrix[n-1-j][i];
  3. matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
  4. matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
  5. 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

至此问题终于完美解决了。。

代码如下:

  1. public class Solution {
  2. public void rotate(int[][] matrix) {
  3. int n = matrix.length;
  4. int limit = (n-1)/2;
  5. for(int i=0;i<= limit; i++){
  6. for(int j=i;j<n-1-i;j++){
  7. int temp = matrix[i][j];
  8. matrix[i][j] = matrix[n-1-j][i];
  9. matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
  10. matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
  11. matrix[j][n-1-i] = temp;
  12. }
  13. }
  14. }
  15. }

LeetCode——Rotate Image(二维数组顺时针旋转90度)的更多相关文章

  1. Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式

    递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...

  2. python3--算法基础:二维数组转90度

    python3--算法基础:二维数组转90度 [0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3] 二维数组转90度 [0, 0, 0, 0][1, 1, ...

  3. python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  4. day4 二维数组旋转90度

    二维数组的旋转其实就是数组里面的元素对调的情况:下面有一个4×4的二维数组,[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]],现在要求把 ...

  5. Rotate Image(二位数组顺时针旋转)

    问题描述: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...

  6. python-二维数组实现90度旋转

    本篇主要介绍了对一个N*N的数组,如果进行90度的旋转 首先,定义一个一维数组很简单,如下: a = [i for i in range(10)] print(a) -----结果----- 0, 1 ...

  7. leetcode 将一个二维矩阵进行90度旋转

    import numpy as np import math if __name__ == '__main__': def rotate(matrix): n = len(matrix[0]) for ...

  8. Python之二维数组N*N顺时针旋转90度

    需求:把一个二维数组顺时针旋转90度,现实数据的替换. 比如把4*4的二维数组顺时针旋转90度 原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', ' ...

  9. Arrays工具、二维数组以及LeetCode练习题

    1 Arrays PS:Arrays位于java.util包下 int binarySearch(type[] a, type key); 使用二分法查询 key 元素在 a 数组中的索引,如果数组不 ...

随机推荐

  1. 【leetcode】Word Ladder II

      Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...

  2. Debian安装python-rrdtool

    ... sudo apt-get install rrdtool sudo apt-get install librrd-dev sudo apt-get install python-dev pip ...

  3. php如何妩媚地生成执行的sql语句

    会不会碰到这样一种情况呢?每次获取数据将数据和历史版本都有一定的差别,然而用ThinkPHP的addAll()函数,却会将已有的数据删掉再重新写入.这明显不是我们想要的.但自己写sql每次几十个字段也 ...

  4. C#操作字符串方法总结<转>

    staticvoid Main(string[] args) { string s =""; //(1)字符访问(下标访问s[i]) s ="ABCD"; Co ...

  5. Delphi XE5 常见问题解答

    Delphi XE5 常见问题解答 有关于新即时试用的问题吗?请看看 RAD Studio 即时试用常见问答. 常见问题 什么是 Delphi? Embarcadero? Delphi? XE5 是易 ...

  6. Python2.7<-------->Python3.x

    版本差异 from __future__   Python2.7 Python3.x 除法 / // Unicode u''                                       ...

  7. [转] Git 基础 - 打标签

    2.6 Git 基础 - 打标签 打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列 ...

  8. 【python】多进程学习

    来源:廖雪峰 讲解看来源吧 把例子记一下 1.用fork创建进程 import os print "Process (%s) start..." % os.getpid() pid ...

  9. myEclipse中改了项目名,出现的问题 和 错误java.io.IOException: tmpFile.renameTo(classFile) failed

    今天遇到一个很头疼的问题,建的一个新项目,后来因为一些原因把项目名改了,之后就做了一些业务,但运行时总是没有反应,后来在myEclipse工作空间下的webapps文件中发现, 部署的文件名和项目名称 ...

  10. NIS域配置详解

    一.前期准备1.1 NIS 简介NIS,英文的全称是network information service,也叫yellow pages.在Linux中,NIS是一个基于RPC的client/serv ...