forked from AnasImloul/Leetcode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGrid Illumination.java
152 lines (137 loc) · 5.93 KB
/
Grid Illumination.java
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
class Solution {
public int[] gridIllumination(int n, int[][] lamps, int[][] queries) {
//we take 5 hashmap
//1st hashmap for row
HashMap<Integer, Integer> row = new HashMap<>();
//2nd hashmap for column
HashMap<Integer, Integer> col = new HashMap<>();
//3rd hashmap for lower diagonal
HashMap<Integer, Integer> d1 = new HashMap<>();
//4th diagonal for upper diagonal
HashMap<Integer, Integer> d2 = new HashMap<>();
//5th diagonal for cell no meaning lamp is present at this spot
HashMap<Integer, Integer> cellno = new HashMap<>();
for(int i = 0;i<lamps.length;i++){
//get row and column from lamps array
int row1 = lamps[i][0];
int col1 = lamps[i][1];
//place row in row hashmap
row.put(row1, row.getOrDefault(row1, 0) + 1);
//place column in col hashmap
col.put(col1, col.getOrDefault(col1, 0) + 1);
//place d1 dia in d1
d1.put((row1+col1), d1.getOrDefault((row1+col1), 0) + 1);
//place d2 diagonal
d2.put((row1-col1), d2.getOrDefault((row1-col1), 0) + 1);
//place cellno in cell no hashmap
int cell = row1*n+col1;
cellno.put(cell, cellno.getOrDefault(cell, 0) + 1);
}
//direction array which travels in 8 adjacent direction
int[][] dir = {{-1, 0},{-1, 1},{0, 1},{1, 1},{1, 0},{1, -1},{0, -1},{-1, -1}};
int[] ans = new int[queries.length];
//process all queries
for(int i = 0;i<queries.length;i++){
int row1 = queries[i][0];
int col1 = queries[i][1];
int cell = row1 * n + col1;
ans[i] = (row.containsKey(row1) || col.containsKey(col1) || d1.containsKey(row1 + col1) || d2.containsKey(row1-col1) || cellno.containsKey(cell))? 1:0;
//if query has a bulb
if(cellno.containsKey(cell)){
int val = cellno.get(cell);
cellno.remove(cell);
//for row
if(row.containsKey(row1)){
int rowval = row.get(row1);
rowval-=val;
if(rowval == 0){
row.remove(row1);
}else{
row.put(row1, rowval);
}
}
//for col
if(col.containsKey(col1)){
int colval = col.get(col1);
colval-=val;
if(colval == 0){
col.remove(col1);
}else{
col.put(col1, colval);
}
}
//for d1
if(d1.containsKey(row1+col1)){
int d1val = d1.get(row1+col1);
d1val-=val;
if(d1val == 0){
d1.remove(row1+col1);
}else{
row.put((row1+col1), d1val);
}
}
//for d2
if(d2.containsKey(row1 - col1)){
int d2val = d2.get(row1-col1);
d2val-=val;
if(d2val == 0){
d2.remove(row1-col1);
}else{
d2.put((row1-col1), d2val);
}
}
}
//moves all 8 direction and remove the illumination
for(int j = 0;j<dir.length;j++){
int rowdash = row1 + dir[j][0];
int coldash = col1 + dir[j][1];
int cellno1 = rowdash * n + coldash;
if(cellno.containsKey(cellno1)){
int val = cellno.get(cellno1);
cellno.remove(cellno1);
//for row
if(row.containsKey(rowdash)){
int rowval = row.get(rowdash);
rowval -= val;
if(rowval == 0){
row.remove(rowdash);
}else{
row.put(rowdash, rowval);
}
}
//for col
if(col.containsKey(coldash)){
int colval = col.get(coldash);
colval-=val;
if(colval == 0){
col.remove(coldash);
}else{
col.put(coldash, colval);
}
}
//for d1
if(d1.containsKey(rowdash+coldash)){
int d1val = d1.get(rowdash+coldash);
d1val-=val;
if(d1val == 0){
d1.remove(rowdash+coldash);
}else{
row.put((rowdash+coldash), d1val);
}
}
//for d2
if(d2.containsKey(rowdash - coldash)){
int d2val = d2.get(rowdash-coldash);
d2val-=val;
if(d2val == 0){
d2.remove(rowdash-coldash);
}else{
d2.put((rowdash-coldash), d2val);
}
}
}
}
}
return ans;
}
}