Skip to content

Commit 0988ba7

Browse files
committed
feat: add solutions to lc problem: No.0302
No.0302.Smallest Rectangle Enclosing Black Pixels
1 parent fb3255b commit 0988ba7

File tree

6 files changed

+695
-2
lines changed

6 files changed

+695
-2
lines changed

solution/0300-0399/0302.Smallest Rectangle Enclosing Black Pixels/README.md

Lines changed: 236 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,257 @@
3535

3636
<!-- 这里可写通用的实现逻辑 -->
3737

38+
二分查找,时间复杂度 `O(mlogn + nlogm)`
39+
3840
<!-- tabs:start -->
3941

4042
### **Python3**
4143

4244
<!-- 这里可写当前语言的特殊实现逻辑 -->
4345

4446
```python
45-
47+
class Solution:
48+
def minArea(self, image: List[List[str]], x: int, y: int) -> int:
49+
m, n = len(image), len(image[0])
50+
left, right = 0, x
51+
while left < right:
52+
mid = (left + right) >> 1
53+
c = 0
54+
while c < n and image[mid][c] == '0':
55+
c += 1
56+
if c < n:
57+
right = mid
58+
else:
59+
left = mid + 1
60+
u = left
61+
left, right = x, m - 1
62+
while left < right:
63+
mid = (left + right + 1) >> 1
64+
c = 0
65+
while c < n and image[mid][c] == '0':
66+
c += 1
67+
if c < n:
68+
left = mid
69+
else:
70+
right = mid - 1
71+
d = left
72+
left, right = 0, y
73+
while left < right:
74+
mid = (left + right) >> 1
75+
r = 0
76+
while r < m and image[r][mid] == '0':
77+
r += 1
78+
if r < m:
79+
right = mid
80+
else:
81+
left = mid + 1
82+
l = left
83+
left, right = y, n - 1
84+
while left < right:
85+
mid = (left + right + 1) >> 1
86+
r = 0
87+
while r < m and image[r][mid] == '0':
88+
r += 1
89+
if r < m:
90+
left = mid
91+
else:
92+
right = mid - 1
93+
r = left
94+
return (d - u + 1) * (r - l + 1)
4695
```
4796

4897
### **Java**
4998

5099
<!-- 这里可写当前语言的特殊实现逻辑 -->
51100

52101
```java
102+
class Solution {
103+
104+
public int minArea(char[][] image, int x, int y) {
105+
int m = image.length, n = image[0].length;
106+
int left = 0, right = x;
107+
while (left < right) {
108+
int mid = (left + right) >> 1;
109+
int c = 0;
110+
while (c < n && image[mid][c] == '0') {
111+
++c;
112+
}
113+
if (c < n) {
114+
right = mid;
115+
} else {
116+
left = mid + 1;
117+
}
118+
}
119+
int u = left;
120+
left = x;
121+
right = m - 1;
122+
while (left < right) {
123+
int mid = (left + right + 1) >> 1;
124+
int c = 0;
125+
while (c < n && image[mid][c] == '0') {
126+
++c;
127+
}
128+
if (c < n) {
129+
left = mid;
130+
} else {
131+
right = mid - 1;
132+
}
133+
}
134+
int d = left;
135+
left = 0;
136+
right = y;
137+
while (left < right) {
138+
int mid = (left + right) >> 1;
139+
int r = 0;
140+
while (r < m && image[r][mid] == '0') {
141+
++r;
142+
}
143+
if (r < m) {
144+
right = mid;
145+
} else {
146+
left = mid + 1;
147+
}
148+
}
149+
int l = left;
150+
left = y;
151+
right = n - 1;
152+
while (left < right) {
153+
int mid = (left + right + 1) >> 1;
154+
int r = 0;
155+
while (r < m && image[r][mid] == '0') {
156+
++r;
157+
}
158+
if (r < m) {
159+
left = mid;
160+
} else {
161+
right = mid - 1;
162+
}
163+
}
164+
int r = left;
165+
return (d - u + 1) * (r - l + 1);
166+
}
167+
}
168+
169+
```
170+
171+
### **C++**
172+
173+
```cpp
174+
class Solution {
175+
public:
176+
int minArea(vector<vector<char>>& image, int x, int y) {
177+
int m = image.size(), n = image[0].size();
178+
int left = 0, right = x;
179+
while (left < right)
180+
{
181+
int mid = (left + right) >> 1;
182+
int c = 0;
183+
while (c < n && image[mid][c] == '0') ++c;
184+
if (c < n) right = mid;
185+
else left = mid + 1;
186+
}
187+
int u = left;
188+
left = x;
189+
right = m - 1;
190+
while (left < right)
191+
{
192+
int mid = (left + right + 1) >> 1;
193+
int c = 0;
194+
while (c < n && image[mid][c] == '0') ++c;
195+
if (c < n) left = mid;
196+
else right = mid - 1;
197+
}
198+
int d = left;
199+
left = 0;
200+
right = y;
201+
while (left < right)
202+
{
203+
int mid = (left + right) >> 1;
204+
int r = 0;
205+
while (r < m && image[r][mid] == '0') ++r;
206+
if (r < m) right = mid;
207+
else left = mid + 1;
208+
}
209+
int l = left;
210+
left = y;
211+
right = n - 1;
212+
while (left < right)
213+
{
214+
int mid = (left + right + 1) >> 1;
215+
int r = 0;
216+
while (r < m && image[r][mid] == '0') ++r;
217+
if (r < m) left = mid;
218+
else right = mid - 1;
219+
}
220+
int r = left;
221+
return (d - u + 1) * (r - l + 1);
222+
}
223+
};
224+
```
225+
226+
### **Go**
53227
228+
```go
229+
func minArea(image [][]byte, x int, y int) int {
230+
m, n := len(image), len(image[0])
231+
left, right := 0, x
232+
for left < right {
233+
mid := (left + right) >> 1
234+
c := 0
235+
for c < n && image[mid][c] == '0' {
236+
c++
237+
}
238+
if c < n {
239+
right = mid
240+
} else {
241+
left = mid + 1
242+
}
243+
}
244+
u := left
245+
left, right = x, m-1
246+
for left < right {
247+
mid := (left + right + 1) >> 1
248+
c := 0
249+
for c < n && image[mid][c] == '0' {
250+
c++
251+
}
252+
if c < n {
253+
left = mid
254+
} else {
255+
right = mid - 1
256+
}
257+
}
258+
d := left
259+
left, right = 0, y
260+
for left < right {
261+
mid := (left + right) >> 1
262+
r := 0
263+
for r < m && image[r][mid] == '0' {
264+
r++
265+
}
266+
if r < m {
267+
right = mid
268+
} else {
269+
left = mid + 1
270+
}
271+
}
272+
l := left
273+
left, right = y, n-1
274+
for left < right {
275+
mid := (left + right + 1) >> 1
276+
r := 0
277+
for r < m && image[r][mid] == '0' {
278+
r++
279+
}
280+
if r < m {
281+
left = mid
282+
} else {
283+
right = mid - 1
284+
}
285+
}
286+
r := left
287+
return (d - u + 1) * (r - l + 1)
288+
}
54289
```
55290

56291
### **...**

0 commit comments

Comments
 (0)