LeetCode – Rotate Image (Java)

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?

Naive Solution

In the following solution, a new 2-dimension array is created to store the rotated matrix, and the result is assigned to the matrix at the end. This is WRONG! Why?

public class Solution {
    public void rotate(int[][] matrix) {
        if(matrix == null || matrix.length==0)
            return ;
 
        int m = matrix.length;
 
        int[][] result = new int[m][m];
 
        for(int i=0; i<m; i++){
            for(int j=0; j<m; j++){
                result[j][m-1-i] = matrix[i][j];
            }
        } 
 
        matrix = result;
    }
}

The problem is that Java is pass by value not by refrence! "matrix" is just a reference to a 2-dimension array. If "matrix" is assigned to a new 2-dimension array in the method, the original array does not change. Therefore, there should be another loop to assign each element to the array referenced by "matrix". Check out "Java pass by value."

public class Solution {
    public void rotate(int[][] matrix) {
        if(matrix == null || matrix.length==0)
            return ;
 
        int m = matrix.length;
 
        int[][] result = new int[m][m];
 
        for(int i=0; i<m; i++){
            for(int j=0; j<m; j++){
                result[j][m-1-i] = matrix[i][j];
            }
        } 
 
       for(int i=0; i<m; i++){
            for(int j=0; j<m; j++){
                matrix[i][j] = result[i][j];
            }
        } 
    }
}

In-place Solution

By using the relation "matrix[i][j] = matrix[n-1-j][i]", we can loop through the matrix.

public void rotate(int[][] matrix) {
	int n = matrix.length;
	for (int i = 0; i < n / 2; i++) {
		for (int j = 0; j < Math.ceil(((double) n) / 2.); 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;
		}
	}
}
Category >> Algorithms  
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code> 
String foo = "bar";
</code></pre>
  • hina jain

    I think the j should be initialized to i instead of 0 in the second for loop.

  • svGuy

    transpose the matrix and swap rows

  • svGuy

    its easier to transpose the matrix first and then swap columns for clockwise rotation.

  • Ivy G

    You can replace “Math.ceil(((double) n) / 2.” with “(n+1)/2”

  • Chen Chen

    Great! Thanks for sharing.

  • my boo

    my bad, I got the axis messed up.

  • my boo

    Your algorithm counter rotate the image instead of clock wise rotate.

  • Guest

    If I is your matrix

    for i in range(n):
    j=0
    while(j<i):
    temp=a[i][j]
    a[i][j]=a[j][i]
    a[j][i]=temp
    j+=1

    print a

  • A Programmer

    how would you do it counter clockwise?

  • kinshuk chandra

    I liked the inplace solution. I have also done the same thing here – http://k2code.blogspot.in/2014/03/rotate-n-n-matrix-by-90-degrees.html