2
public int[][] rotateGrid(int[][] grid, int k) {3
int m = grid.length, n = grid[0].length, noOfLayers = Math.min(m / 2, n / 2);4
// Peeling each layer one by one5
for (int layerNo = 0; layerNo < noOfLayers; layerNo++) {6
// Please suggest if you have better way to find perimeter of matrix on a given layer!9
+ (n - (2 * layerNo) - 1)10
+ (m - (2 * layerNo) - 1)11
+ (n - (2 * layerNo) - 2);12
int[] layer = new int[perimeter]; // this out be use to store that particular layer13
readLayer(grid, layer, layerNo, m, n); // this will read the layer15
grid, layer, layerNo, m, n, k); // this will rotate it by k and write back the layer20
public void readLayer(int[][] grid, int[] layer, int layerNo, int m, int n) {21
int count = 0, r = layerNo, c = layerNo;25
for (int i = layerNo; i < n - layerNo; i++) layer[count++] = grid[layerNo][i];27
for (int i = layerNo; i < m - layerNo; i++) layer[count++] = grid[i][n - layerNo];29
for (int i = n - layerNo; i > layerNo; i--) layer[count++] = grid[m - layerNo][i];31
for (int i = m - layerNo; i > layerNo; i--) layer[count++] = grid[i][layerNo];34
public void writeLayer(int[][] grid, int[] layer, int layerNo, int m, int n, int k) {37
int len = layer.length, count = k;39
for (int i = layerNo; i < n - layerNo; i++) {40
count %= len; // reason if goes out of length start back from 041
grid[layerNo][i] = layer[count++];44
for (int i = layerNo; i < m - layerNo; i++) {46
grid[i][n - layerNo] = layer[count++];49
for (int i = n - layerNo; i > layerNo; i--) {51
grid[m - layerNo][i] = layer[count++];54
for (int i = m - layerNo; i > layerNo; i--) {56
grid[i][layerNo] = layer[count++];