问题:

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

public void rotate(int[][] matrix) {
int n = matrix.length;
int[][] m = new int[n][n];
for(int row=0;row<n;row++){
for(int col=0;col<n;col++){
m[row][col] = matrix[n-1-col][row];
}
}
//再赋值回matrix,注意java是形参是引用传递
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

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

代码如下:

public class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
int limit = (n-1)/2;
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;
}
}
}
}

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. ccf559c

    题意:给出一个矩阵棋盘,大小不超过10^5.上面有n个非法点(n<=2000)不可以踩,从左上角开始走到右下角,每次只能向下或者向右移动.问有多少种走法.结果对10^9+7取模. 分析: 组合数 ...

  2. ios 关于UIView 的multipleTouchEnabled 和 exclusiveTouch

    做项目时发现,在一个界面上的2个button竟然可以同时点击,依次push进去了2个 controller!我就产生了疑问,一个view的multipleTouchEnabled属性默认是false啊 ...

  3. ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)

    这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...

  4. 原:[eclipse启动错误] JVM terminated.Exit code=2

    启动eclipse的时候忽然出现以下错误: 解决方案: 删除环境变量PATH或者Path中的 C:\ProgramData\Oracle\Java\javapath

  5. linux线程的实现

    首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...

  6. JS判断客户端是手机还是PC的2个代码(转)

    转载自:http://www.jb51.net/article/48939.htm Javascript 判断客户端是否为 PC 还是手持设备,有时候项目中需要用到,很方便的检测,源生的哦,方法一共有 ...

  7. Java实现注册邮箱激活验证

    邮件发送servelet实现 package com.xbs.register.main; import java.io.IOException;import java.util.Date;impor ...

  8. 【leetcode】Spiral Matrix(middle)

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  9. 51nod 1070 Bash游戏 V4 (斐波那契博弈)

    题目:传送门. 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的 ...

  10. html5手机网站需要加的那些meta/link标签,html5 meta全解

    原文链接:http://blog.csdn.net/kongjiea/article/details/17092413(收藏专用!如需转载,请点击链接,联系博主,获得同意后方可转载) 3.name之设 ...