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 数组中的索引,如果数组不 ...
随机推荐
- 【leetcode】Word Ladder II
Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...
- Debian安装python-rrdtool
... sudo apt-get install rrdtool sudo apt-get install librrd-dev sudo apt-get install python-dev pip ...
- php如何妩媚地生成执行的sql语句
会不会碰到这样一种情况呢?每次获取数据将数据和历史版本都有一定的差别,然而用ThinkPHP的addAll()函数,却会将已有的数据删掉再重新写入.这明显不是我们想要的.但自己写sql每次几十个字段也 ...
- C#操作字符串方法总结<转>
staticvoid Main(string[] args) { string s =""; //(1)字符访问(下标访问s[i]) s ="ABCD"; Co ...
- Delphi XE5 常见问题解答
Delphi XE5 常见问题解答 有关于新即时试用的问题吗?请看看 RAD Studio 即时试用常见问答. 常见问题 什么是 Delphi? Embarcadero? Delphi? XE5 是易 ...
- Python2.7<-------->Python3.x
版本差异 from __future__ Python2.7 Python3.x 除法 / // Unicode u'' ...
- [转] Git 基础 - 打标签
2.6 Git 基础 - 打标签 打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列 ...
- 【python】多进程学习
来源:廖雪峰 讲解看来源吧 把例子记一下 1.用fork创建进程 import os print "Process (%s) start..." % os.getpid() pid ...
- myEclipse中改了项目名,出现的问题 和 错误java.io.IOException: tmpFile.renameTo(classFile) failed
今天遇到一个很头疼的问题,建的一个新项目,后来因为一些原因把项目名改了,之后就做了一些业务,但运行时总是没有反应,后来在myEclipse工作空间下的webapps文件中发现, 部署的文件名和项目名称 ...
- NIS域配置详解
一.前期准备1.1 NIS 简介NIS,英文的全称是network information service,也叫yellow pages.在Linux中,NIS是一个基于RPC的client/serv ...