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?
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; } } } |
I think `int j = 0` can be optimized to `int j = i`.
Explanation:
The algorithm iterates over the layers of the matrix – the `i` loop` – has `n/2` layers.
The `j` loop iterates over the elements remained in the `i`-th layer.
But, for example, element 1,0, was already handled in the `i=0` layer. No need to handle it again.
The recursive version… just for fun 🙂
public void rotate(int[][] a) {
if (a == null || a.length <= 1)
return;
rotate(a, 0, a.length-1);
}
private void rotate(int[][] a, int start, int limit) {
if (limit <= 0)
return;
for (int j = start; j < start+limit; j++) {
int t = a[start][j];
int jOff = j-start;
a[start][j] = a[start+limit-jOff][start];
a[start+limit-jOff][start] = a[start+limit][start+limit-jOff];
a[start+limit][start+limit-jOff] = a[j][start+limit];
a[j][start+limit] = t;
}
rotate (a, start+1, limit-2);
}
int length = matrix.length-1;
System.out.println("len "+matrix.length);
for (int i = 0; i <= (length)/2; i++) {
for (int j = i; j < length-i; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[length-j][i];
matrix[length-j][i] = matrix[length-i][length-j];
matrix[length-i][length-j] = matrix[j][length-i];
matrix[j][length-i] = temp;
}
}
why Math.ceil(((double) n) /2.) is used?
I think the j should be initialized to i instead of 0 in the second for loop.
transpose the matrix and swap rows
its easier to transpose the matrix first and then swap columns for clockwise rotation.
You can replace “Math.ceil(((double) n) / 2.” with “(n+1)/2”
Great! Thanks for sharing.
my bad, I got the axis messed up.
Your algorithm counter rotate the image instead of clock wise rotate.
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
how would you do it counter clockwise?
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