[leetcode]48. Rotate Image旋转图像

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Note:

You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

Example 1:

Given input matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

rotate the input matrix in-place such that it becomes:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

Example 2:

Given input matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

rotate the input matrix in-place such that it becomes:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

题意:

In-place 顺时针旋转90度

Solution1: Try a simulation by matrix [2X2],  find the principle how to rotate

i.e:

Original:
1 2
3 4

Rotated:
3 1
4 2

Q:  How do we get value 3 from (1,0) to (0,0) ?

A:  flip matrix from up to down 

Flip up down from original:

3 4
1 2

Q: How do we put values 1 and 4 to their own places?

A:  flip matrix by diagonal

Flip matrix by diagonal:

3 1
4 2

code

 1 /*
 2 Time:O(n^2). We use nested 2 for loop.
 3 Space: O(1). We only used constant extra space.  
 4 */
 5 class Solution {
 6     public void rotate(int[][] matrix) {
 7         int n = matrix.length; 
 8         // flip  matrix from up to down 
 9         for(int i = 0; i < n/2; i++){
10             for(int j = 0; j< n; j++){
11                 swap(matrix, i, j, n-i-1, j);
12             }
13         }
14         //flip matrix by diagonal
15         for(int i = 0; i < n; i++){
16             for(int j = i+1; j < n; j++){
17                  swap(matrix, i, j, j, i);
18             }
19         }
20     }  
21     private void swap(int[][] matrix, int i, int j, int a, int b){
22         int tmp = matrix[i][j];
23         matrix[i][j] = matrix[a][b];
24         matrix[a][b] = tmp;   
25     }
26 }
原文地址:https://www.cnblogs.com/liuliu5151/p/10708468.html