LeetCode 48 Rotate Image

来源:互联网 发布:工资条制作软件 编辑:程序博客网 时间:2024/05/16 06:49

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?

首先想到的是纯模拟,所有的元素都相当于是围绕矩阵正中心的点进行旋转90°,等价于所有的点matrix[i][j] = matrix[n - j - 1][i]。每个元素要90°挪动,相当于270°挪到0°,180°挪到270°,90°挪到180°,0°挪到90°。顺便再看看图,图中1号区域到2号,2号到3号,3号到4号,4号到1号,,还是直接看代码吧。


public void rotate(int[][] matrix) {int n = matrix.length;for (int i = 0; i < n / 2; i++) {for (int j = i; j < n - i - 1; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[n - j - 1][i];matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];matrix[j][n - i - 1] = temp;}}}

还有一个方式,先沿着副对角线旋转一次,再沿着水平中线旋转以此,即可达到目的。因为沿着副对角线旋转,相当于matrix[i][j] = matrix[n - 1 - j][n - i - 1],但是我们的目的是matrix[i][j] = matrix[n - j - 1][i]才可以达到垂直旋转的效果,因此需要再进行处理,进行水平中线旋转,matrix[i][j] = matrix[n - 1 - i][j],即可达到效果。


代码如下:

public void rotate2(int[][] matrix) {int n = matrix.length;for (int i = 0; i < n; i++)for (int j = 0; j < n - i; j++) {int tmp = matrix[i][j];matrix[i][j] = matrix[n - 1 - j][n - i - 1];matrix[n - 1 - j][n - i - 1] = tmp;}for (int i = 0; i < n / 2; i++)for (int j = 0; j < n; j++) {int tmp = matrix[i][j];matrix[i][j] = matrix[n - 1 - i][j];matrix[n - 1 - i][j] = tmp;}}


0 0
原创粉丝点击