-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshell-rotate.java
More file actions
76 lines (57 loc) · 2.17 KB
/
shell-rotate.java
File metadata and controls
76 lines (57 loc) · 2.17 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* Shell Rotate
Time Complexity: O(n+m) & Space Complexity: O(n+m)
*/
class Solution{
void shellRotate(int arr[][], int s, int r) {
int[] oneD = find1DFromShell(arr, s);
rotateArray(oneD, r);
findShellFrom1D(arr, s, oneD);
}
int[] find1DFromShell(int arr[][], int s){
int minrow = s-1;
int maxrow = arr.length - s;
int mincol = s-1;
int maxcol = arr[0].length - s;
int size = 2*(maxrow-minrow) + 2*(maxcol-mincol);
int oneD[] = new int[size];
int index = 0;
// left wall
for(int i=minrow; i<=maxrow; i++, index++) oneD[index] = arr[i][mincol];
// bottom wall
for(int i=mincol+1; i<=maxcol; i++, index++) oneD[index] = arr[maxrow][i];
// right wall
for(int i=maxrow-1; i>=minrow; i--, index++) oneD[index] = arr[i][maxcol];
// top wall
for(int i=maxcol-1; i>mincol; i--, index++) oneD[index] = arr[minrow][i];
return oneD;
}
void rotateArray(int oneD[], int r){
r %= oneD.length;
if( r < 0 ) r += oneD.length;
reverseArray(oneD, 0, oneD.length-r-1);
reverseArray(oneD, oneD.length-r, oneD.length-1);
reverseArray(oneD, 0, oneD.length-1);
}
void reverseArray(int oneD[], int i, int j){
for( ; i < j; i++, j--){
int temp = oneD[i];
oneD[i] = oneD[j];
oneD[j] = temp;
}
}
void findShellFrom1D(int[][] arr, int s, int[] oneD){
int minrow = s-1;
int maxrow = arr.length - s;
int mincol = s-1;
int maxcol = arr[0].length - s;
int index = 0;
// left wall
for(int i=minrow; i<=maxrow; i++, index++) arr[i][mincol] = oneD[index];
// bottom wall
for(int i=mincol+1; i<=maxcol; i++, index++) arr[maxrow][i] = oneD[index];
// right wall
for(int i=maxrow-1; i>=minrow; i--, index++) arr[i][maxcol] = oneD[index];
// top wall
for(int i=maxcol-1; i>mincol; i--, index++) arr[minrow][i] = oneD[index];
}
}