In Place Matrix (2D Array) Clockwise and Counterclockwise Rotation – Java Implementation

Below, you will find a java implementation of class that does a matrix or 2 dimensional array rotation both clockwise and anti clockwise. The approach used here does not take extra buffer i.e. does the stuff IN-PLACE. There is another article in this blog where I have implemented this using extra buffer space.

package com.icodejava.blog.published.maths;

import java.util.Arrays;

/**
 * 
 * @author Kushal Paudyal 
 * Created on: 01/05/2017 
 * Last Modified on: 01/05/2017
 *
 * This class demonstrates how to rotate a NxN array 90 degrees using no extra buffer.
   e.g. 
     [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]
	 
	 should appear as
	 
	 [[5, 10, 15, 20, 25], [4, 9, 14, 19, 24], [3, 8, 13, 18, 23], [2, 7, 12, 17, 22], [1, 6, 11, 16, 21]]
	 for a 90 degrees counter clockwise rotation

	 
	 [[21, 16, 11, 6, 1], [22, 17, 12, 7, 2], [23, 18, 13, 8, 3], [24, 19, 14, 9, 4], [25, 20, 15, 10, 5]]
	 for a 90 degrees clockwise rotation
	 
 */

public class Rotate2DArrayInPlace {
		
public static void main (String args [] ) throws Exception {
		
		Integer [] [] myNxNArray = new Integer [][] {
			{1, 2, 3, 4, 5},
			{6, 7, 8, 9, 10},
			{11, 12, 13, 14, 15},
			{16,17,18,19,20},
			{21,22,23,24,25}
		};
		
		System.out.println("SOURCE ARRAY: \n" + Arrays.deepToString(myNxNArray));
		Integer [][] rotatedInPlace = rotateMatrixInPlaceCounterClockwise(myNxNArray);
		
		System.out.println("ROTATED IN PLACE - 90 degrees COUNTER CLOCKWISE");
		System.out.println(Arrays.deepToString(rotatedInPlace));
		
		//The array referenced in above definition myNxNArray is changed so you will need to redefine
		Integer [] [] myNxNArray1 = new Integer [][] {
			{1, 2, 3, 4, 5},
			{6, 7, 8, 9, 10},
			{11, 12, 13, 14, 15},
			{16,17,18,19,20},
			{21,22,23,24,25}
		};
		
		Integer [][] rotatedInPlaceClockwise = rotateMatrixInPlaceClockwise(myNxNArray1);
		
		System.out.println("ROTATED IN PLACE - 90 degrees CLOCKWISE");
		System.out.println(Arrays.deepToString(rotatedInPlaceClockwise));
		
	}
	
	/**
	 * This method rotates the matrix 90 degrees counter clockwise without using extra buffer..
	 */
	public static Integer[][] rotateMatrixInPlaceCounterClockwise(Integer[][] matrix) throws Exception {
		
		if(matrix.length == 0 || matrix.length != matrix[0].length) {
			throw new Exception ("Invalid Input");
		}

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

		}
		return matrix;
	}
	
	/**
	 * This method rotates the matrix 90 degrees counter clockwise without using extra buffer..
	 */
	public static Integer[][] rotateMatrixInPlaceClockwise(Integer[][] matrix) throws Exception {
		
		if(matrix.length == 0 || matrix.length != matrix[0].length) {
			throw new Exception ("Invalid Input");
		}

		int n = matrix.length;
		int top;
		for (int i = 0; i < n / 2; i++) {
			
			for (int j = i; j < n - i - 1; j++) {
				
				top = 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] = top;
			
			}

		}
		return matrix;
	}

}

OUTPUT:

SOURCE ARRAY: 
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]
ROTATED IN PLACE - 90 degrees COUNTER CLOCKWISE
[[5, 10, 15, 20, 25], [4, 9, 14, 19, 24], [3, 8, 13, 18, 23], [2, 7, 12, 17, 22], [1, 6, 11, 16, 21]]
ROTATED IN PLACE - 90 degrees CLOCKWISE
[[21, 16, 11, 6, 1], [22, 17, 12, 7, 2], [23, 18, 13, 8, 3], [24, 19, 14, 9, 4], [25, 20, 15, 10, 5]]
  1. Recursively Finding Greatest Common Divisor (GCD) – Java Implementation
  2. Implementing a Simple LIFO Stack in Java using LinkedList
  3. Implementing a Simple FIFO Queue in Java Using Linked List
  4. In Place Matrix (2D Array) Clockwise and Counterclockwise Rotation – Java Implementation
  5. Matrix (2D Array) Clockwise and Counterclockwise Rotation with Extra Buffer – Java Implementation
  6. Array Max Integer Finder (With Big O Analysis)
  7. A Basic Implementation of Binary Tree in Java
  8. A Basic Implementation of Generic Tree in Java
  9. Basic example of implementing Singly Linked List in Java
  10. Prime Number Finder In Java
  11. Printing Fibonacci Sequence Using Recursive and Iterative Methods
  12. Finding Square Root Of A Double Number In Java Using Binary Search
  13. How to Add and Remove nodes in an unsorted Linked List
  14. How to swap two variables without using extra temporary variable?
  15. Rotating a two dimensional integer array In-Place and using extra memory
  16. How to reverse a Singly Linked List iteratively and recursively
  17. Sorted Circular Linked List Implementation And Insert Operation
  18. Finding Mean Value Of An Integer Array In Java
  19. How to intersect two sets in Java using java.util.Set data structure.
  20. Bubble Sorting An Integer Array In Ascending and Descending Order
  21. How to split strings and separate the words with spaces
  22. How to easily sort characters in a String?
Tagged , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *