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] ]
We can solve this in 2 different ways.
- By reversing and swapping
- By flipping
1. Rotating and swapping the elements.
In this solution we first reverse the array, means 1st row will go to 3rd row and 3rd row will come to the first row.
Hence if our input is:
1 2 3 4 5 6 7 8 9
after reversing the array, the output will be:
7 8 9 4 5 6 1 2 3
Then you swap the elements diagonally, after this step, the output will be:
7 4 1 8 5 2 9 6 3
Hence our final result.
2. By flipping
In this solution, we flip the array 2 times. One is diagonal flip and Second is horizontal flip.
If our original array is:
1 2 3 4 5 6 7 8 9
After the diagonal flip, the output will be:
1 4 7 2 5 8 3 6 9
After the horizontal flip, the output will be:
7 4 1 8 5 2 9 6 3
The final array.
Solution in C++
#include<iostream> #include<vector> using namespace std; void rotate(vector<vector<int> >& myMatrix) { reverse(myMatrix.begin(), myMatrix.end()); int size = myMatrix.size(); for (int i = 0; i < size; ++i) { for (int j = i+1; j < size; ++j) { swap(myMatrix[i][j], myMatrix[j][i]); } } } void flip(vector<vector<int> >& myMatrix) { int size = myMatrix.size(); /*Flip Diagonally*/ for (size_t i = 0; i < size; i++) { for (size_t j = i; j < size; j++) { swap(myMatrix[i][j], myMatrix[j][i]); } } /* flip horizontally */ for (size_t i = 0; i < size; i++) { reverse(myMatrix[i].begin(), myMatrix[i].end()); } } int main() { //Declare a 2d array vector<vector<int> > myMatrix; int row = 3; int column = 3; int temp = 1; // variable to put the values in to vector //populate the array for(int i=0; i < row; i++) { //create a temp vector, it will act as a row vector<int> temp_vector; for(int i=0; i<column; i++) { temp_vector.push_back(temp); temp++; } // push the content of temp vector to the main vector myMatrix.push_back(temp_vector); } cout<< "Entered vector is : "<<endl; for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) cout << myMatrix[i][j] << ' '; cout << endl; } //rotate(myMatrix); flip(myMatrix); cout<< "Final vector is : "<<endl; for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) cout << myMatrix[i][j] << ' '; cout << endl; } return 0; }
Output: Entered vector is : 1 2 3 4 5 6 7 8 9 Final vector is : 7 4 1 8 5 2 9 6 3
Share your solution in the comment section below.