Problem
Given an integer matrix, print it in spiral form
Sample Input
[1 2 3 4] [4 5 6 7] [8 9 10 11]
Sample Output
1 2 3 4 7 11 10 9 8 4 5 6
Approach
We can maintain four variables and four for loops to traverse four edges of the matrix. The edges keep on shrinking after every iteration around the matrix. The time complexity of the approach is O(MxN).
C++
#include <iostream> #include <vector> usingnamespacestd; voidsolve(vector<vector<int>> matrix, int top, int bottom, int left, int right) { if (matrix.size() == 0 || left > right) { return; } // print top row for (int i = left; i <= right; i++) { cout << matrix[top][i] << " "; } top++; if (top > bottom) { return; } // print right column for (int i = top; i <= bottom; i++) { cout << matrix[i][right] << " "; } right--; if (left > right) { return; } // print bottom row for (int i = right; i >= left; i--) { cout << matrix[bottom][i] << " "; } bottom--; if (top > bottom) { return; } // print left column for (int i = bottom; i >= top; i--) { cout << matrix[i][left] << " "; } left++; solve(matrix, top, bottom, left, right); } intmain() { vector<vector<int>> matrix = { { 1, 2, 3, 4, 5}, {16, 17, 18, 19, 6}, {15, 24, 25, 20, 7} }; int top = 0, bottom = matrix.size() - 1; int left = 0, right = matrix[0].size() - 1; solve(matrix, top, bottom, left, right); return0; }
Output
1 2 3 4 5 6 7 20 25 24 15 16 17 18 19
C
#include<stdio.h> voidsolve(int matrix[3][5], int top, int bottom, int left, int right) { if (left > right) { return; } // print top row for (int i = left; i <= right; i++) { printf("%d ",matrix[top][i]); } top++; if (top > bottom) { return; } // print right column for (int i = top; i <= bottom; i++) { printf("%d ",matrix[i][right]); } right--; if (left > right) { return; } // print bottom row for (int i = right; i >= left; i--) { printf("%d ",matrix[bottom][i]); } bottom--; if (top > bottom) { return; } // print left column for (int i = bottom; i >= top; i--) { printf("%d ",matrix[i][left]); } left++; solve(matrix, top, bottom, left, right); } intmain() { int matrix[3][5] = { { 1, 2, 3, 4, 5}, {16, 17, 18, 19, 6}, {15, 24, 25, 20, 7} }; int top = 0, bottom = 2; int left = 0, right = 4; solve(matrix, top, bottom, left, right); return0; }
Output
1 2 3 4 5 6 7 20 25 24 15 16 17 18 19
Python
defsolve(matrix, top, bottom, left, right): if left > right: return # print top row for i in range(left, right + 1): print(matrix[top][i], end=' ') top = top + 1 if top > bottom: return # print right column for i in range(top, bottom + 1): print(matrix[i][right], end=' ') right = right - 1 if left > right: return # print bottom row for i in range(right, left - 1, -1): print(matrix[bottom][i], end=' ') bottom = bottom - 1 if top > bottom: return # print left column for i in range(bottom, top - 1, -1): print(matrix[i][left], end=' ') left = left + 1 solve(matrix, top, bottom, left, right) matrix = [ [1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7] ] top = 0 bottom = len(matrix) - 1 left = 0 right = len(matrix[0]) - 1 solve(matrix, top, bottom, left, right)
Output
1 2 3 4 5 6 7 20 25 24 15 16 17 18 19
People are also reading:
- Rearrange an array in maximum minimum form
- Print all subarrays with 0 sum
- Left Rotate an Array
- Sorted Triplet in an Array
- Shift All Matrix Elements by 1 in Spiral Order
- Job Sequencing Problem
- Activity Selection Problem
- Find Subarrays within Given Sum in an Array
- The Stock Span Problem
- Minimum Edit Distance
Leave a Comment on this Post