LeetCode——Rotate Image(二维数组顺时针旋转90度)
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度)的更多相关文章
- Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式
递归.二维数组顺时针旋转90°.正则表达式 1. 递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...
- 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, ...
- python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- day4 二维数组旋转90度
二维数组的旋转其实就是数组里面的元素对调的情况:下面有一个4×4的二维数组,[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]],现在要求把 ...
- Rotate Image(二位数组顺时针旋转)
问题描述: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...
- python-二维数组实现90度旋转
本篇主要介绍了对一个N*N的数组,如果进行90度的旋转 首先,定义一个一维数组很简单,如下: a = [i for i in range(10)] print(a) -----结果----- 0, 1 ...
- leetcode 将一个二维矩阵进行90度旋转
import numpy as np import math if __name__ == '__main__': def rotate(matrix): n = len(matrix[0]) for ...
- Python之二维数组N*N顺时针旋转90度
需求:把一个二维数组顺时针旋转90度,现实数据的替换. 比如把4*4的二维数组顺时针旋转90度 原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', ' ...
- Arrays工具、二维数组以及LeetCode练习题
1 Arrays PS:Arrays位于java.util包下 int binarySearch(type[] a, type key); 使用二分法查询 key 元素在 a 数组中的索引,如果数组不 ...
随机推荐
- poj 1789
http://poj.org/problem?id=1789 这是一道图论的题,个人觉得和那个POJ1258是差不多的,就是多了一步,题目难以读懂 题目的意思:就是给你一群字符串要你找字符串对应的字符 ...
- python 3.5.2安装mysql驱动报错
python 3.5.2安装mysql驱动报错 python 3.5.2安装mysql驱动时出现如下异常: [root@localhost www]# pip install mysql-connec ...
- Android 程序中得到root activity的引用
今天写anroid时,想获得一个root activity的引用. ios中这个很简单, [UIApplication sharedApplication].keyWindow 得到window对象, ...
- google API 点连线
这个是模拟的数据,用于测试,为了方便学习 弹出框信息都是固定的,以及操作都不是写的循环,实际开发用 setInterval 或者for 以减少冗余. <!DOCTYPE html> < ...
- a byte of python(摘04)
a byte of python 第十章 输入/输出 如何使程序和用户进行交互?(用 raw_input 和 print语句来完成) 对于输出,你也可以使用多种多样的 str(字符串)类.使用 rju ...
- UVALive 4953 Wormly--【提醒自己看题要仔细】
有一条虫要过桥,桥有断的木板和好的木板.虫有L条腿B个身体,桥长N.01串表示桥的好坏.输出最少操作次数. 一开始虫的身体在最左B桥上,腿在最左L桥上,最后要到达最右B以及最右L... 操作有2种:① ...
- css实现图片闪光效果
1.这个效果是看到京东商城上的一个下效果,原本的思路是 用js控制一个图片在某张需要闪光的图片上重复出现,但是 网上找了一些资料,竟然是用css写的,真是太帅了!!! 2.原理:在需要闪光的图片前添加 ...
- Split()的简单的用法
1.Split分割一些简答的字符串事例: string str="aaa|bbb|ccc"; string[] list = str.Split('|'); 这是一个字符的切割,但 ...
- iOS应用架构谈(二):View层的组织和调用方案(上)
OS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第二篇,主要讲View层的组织和调用方案.上篇主要讲View层的代码结构. ...
- Ubuntu离线更新flashplugin
当网络太烂时,Ubuntu更新可能会卡在下载flashplugin上面,继而出错.在U论坛上找到一篇帖子,寻到成功安装flashplugin-installer的方法: 1.首先使用sudo apt- ...
旋转之后变为
旋转后变为
旋转后变为




