@@ -103,25 +103,192 @@ tags:
103
103
#### Python3
104
104
105
105
``` python
106
+ from typing import List
106
107
108
+ class Solution :
109
+ def countLineIntersections (self , coordinates : List[tuple[int , int ]]) -> bool :
110
+ lines = 0
111
+ overlap = 0
112
+ for value, marker in coordinates:
113
+ if marker == 0 :
114
+ overlap -= 1
115
+ else :
116
+ overlap += 1
117
+
118
+ if overlap == 0 :
119
+ lines += 1
120
+
121
+ return lines >= 3
122
+
123
+ def checkValidCuts (self , n : int , rectangles : List[List[int ]]) -> bool :
124
+ y_coordinates = []
125
+ x_coordinates = []
126
+
127
+ for rect in rectangles:
128
+ x1, y1, x2, y2 = rect
129
+ y_coordinates.append((y1, 1 )) # start
130
+ y_coordinates.append((y2, 0 )) # end
131
+
132
+ x_coordinates.append((x1, 1 )) # start
133
+ x_coordinates.append((x2, 0 )) # end
134
+
135
+ # Sort by coordinate value, and for tie, put end (0) before start (1)
136
+ y_coordinates.sort(key = lambda x : (x[0 ], x[1 ]))
137
+ x_coordinates.sort(key = lambda x : (x[0 ], x[1 ]))
138
+
139
+ return self .countLineIntersections(y_coordinates) or self .countLineIntersections(x_coordinates)
107
140
```
108
141
109
142
#### Java
110
143
111
144
``` java
112
-
145
+ class Solution {
146
+ // Helper class to mimic C++ pair<int, int>
147
+ static class Pair {
148
+ int value;
149
+ int type;
150
+
151
+ Pair (int value , int type ) {
152
+ this . value = value;
153
+ this . type = type;
154
+ }
155
+ }
156
+
157
+ private boolean countLineIntersections (List<Pair > coordinates ) {
158
+ int lines = 0 ;
159
+ int overlap = 0 ;
160
+
161
+ for (Pair coord : coordinates) {
162
+ if (coord. type == 0 ) {
163
+ overlap-- ;
164
+ } else {
165
+ overlap++ ;
166
+ }
167
+
168
+ if (overlap == 0 ) {
169
+ lines++ ;
170
+ }
171
+ }
172
+
173
+ return lines >= 3 ;
174
+ }
175
+
176
+ public boolean checkValidCuts (int n , int [][] rectangles ) {
177
+ List<Pair > yCoordinates = new ArrayList<> ();
178
+ List<Pair > xCoordinates = new ArrayList<> ();
179
+
180
+ for (int [] rectangle : rectangles) {
181
+ // rectangle = [x1, y1, x2, y2]
182
+ yCoordinates. add(new Pair (rectangle[1 ], 1 )); // y1, start
183
+ yCoordinates. add(new Pair (rectangle[3 ], 0 )); // y2, end
184
+
185
+ xCoordinates. add(new Pair (rectangle[0 ], 1 )); // x1, start
186
+ xCoordinates. add(new Pair (rectangle[2 ], 0 )); // x2, end
187
+ }
188
+
189
+ Comparator<Pair > comparator = (a, b) - > {
190
+ if (a. value != b. value) return Integer . compare(a. value, b. value);
191
+ return Integer . compare(a. type, b. type); // End (0) before Start (1)
192
+ };
193
+
194
+ Collections . sort(yCoordinates, comparator);
195
+ Collections . sort(xCoordinates, comparator);
196
+
197
+ return countLineIntersections(yCoordinates) || countLineIntersections(xCoordinates);
198
+ }
199
+
200
+ }
113
201
```
114
202
115
203
#### C++
116
204
117
205
``` cpp
118
-
206
+ class Solution {
207
+ #define pii pair<int,int>
208
+
209
+ bool countLineIntersections(vector<pii>& coordinates){
210
+ int lines = 0;
211
+ int overlap = 0;
212
+ for(int i=0;i<coordinates.size();++i){
213
+ if(coordinates[i].second==0) overlap--;
214
+ else overlap++;
215
+ if(overlap==0)
216
+ lines++;
217
+ }
218
+ return lines>=3 ;
219
+ }
220
+ public:
221
+ bool checkValidCuts (int n, vector<vector<int >>& rectangles) {
222
+ vector<pii > y_cordinates,x_cordinates;
223
+ for(auto& rectangle: rectangles){
224
+ y_cordinates.push_back(make_pair(rectangle[ 1] ,1));
225
+ y_cordinates.push_back(make_pair(rectangle[ 3] ,0));
226
+ x_cordinates.push_back(make_pair(rectangle[ 0] ,1));
227
+ x_cordinates.push_back(make_pair(rectangle[ 2] ,0));
228
+ }
229
+ sort(y_cordinates.begin(),y_cordinates.end());
230
+ sort(x_cordinates.begin(),x_cordinates.end());
231
+
232
+ //Line-Sweep on x and y cordinates
233
+ return (countLineIntersections(y_cordinates) or countLineIntersections(x_cordinates));
234
+ }
235
+ };
119
236
```
120
237
121
238
#### Go
122
239
123
240
```go
124
-
241
+ type Pair struct {
242
+ val int
243
+ typ int // 1 = start, 0 = end
244
+ }
245
+
246
+ func countLineIntersections(coords []Pair) bool {
247
+ lines := 0
248
+ overlap := 0
249
+ for _, p := range coords {
250
+ if p.typ == 0 {
251
+ overlap--
252
+ } else {
253
+ overlap++
254
+ }
255
+ if overlap == 0 {
256
+ lines++
257
+ }
258
+ }
259
+ return lines >= 3
260
+ }
261
+
262
+ func checkValidCuts(n int, rectangles [][]int) bool {
263
+ var xCoords []Pair
264
+ var yCoords []Pair
265
+
266
+ for _, rect := range rectangles {
267
+ x1, y1, x2, y2 := rect[0], rect[1], rect[2], rect[3]
268
+
269
+ yCoords = append(yCoords, Pair{y1, 1}) // start
270
+ yCoords = append(yCoords, Pair{y2, 0}) // end
271
+
272
+ xCoords = append(xCoords, Pair{x1, 1})
273
+ xCoords = append(xCoords, Pair{x2, 0})
274
+ }
275
+
276
+ sort.Slice(yCoords, func(i, j int) bool {
277
+ if yCoords[i].val == yCoords[j].val {
278
+ return yCoords[i].typ < yCoords[j].typ // end before start
279
+ }
280
+ return yCoords[i].val < yCoords[j].val
281
+ })
282
+
283
+ sort.Slice(xCoords, func(i, j int) bool {
284
+ if xCoords[i].val == xCoords[j].val {
285
+ return xCoords[i].typ < xCoords[j].typ
286
+ }
287
+ return xCoords[i].val < xCoords[j].val
288
+ })
289
+
290
+ return countLineIntersections(yCoords) || countLineIntersections(xCoords)
291
+ }
125
292
```
126
293
127
294
<!-- tabs:end -->
0 commit comments