Skip to content

Commit b4b44cd

Browse files
committed
feat: add solutions to lc problem: No.1580
No.1580.Put Boxes Into the Warehouse II
1 parent 7474af4 commit b4b44cd

File tree

7 files changed

+426
-3
lines changed

7 files changed

+426
-3
lines changed

solution/1500-1599/1580.Put Boxes Into the Warehouse II/README.md

Lines changed: 150 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,171 @@
7575

7676
<!-- 这里可写通用的实现逻辑 -->
7777

78+
**方法一:预处理 + 排序 + 贪心**
79+
80+
我们先对仓库进行预处理,得到每个房间的最大高度,然后对箱子和仓库进行排序,从最小的箱子开始,从最小的房间开始,如果当前房间的高度大于等于当前箱子的高度,则可以将当前箱子放入当前房间,否则继续寻找下一个房间。
81+
82+
最后返回可以放入的箱子数量。
83+
84+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为仓库的长度。
85+
7886
<!-- tabs:start -->
7987

8088
### **Python3**
8189

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

8492
```python
85-
93+
class Solution:
94+
def maxBoxesInWarehouse(self, boxes: List[int], warehouse: List[int]) -> int:
95+
n = len(warehouse)
96+
left = [0] * n
97+
right = [0] * n
98+
left[0] = right[-1] = inf
99+
for i in range(1, n):
100+
left[i] = min(left[i - 1], warehouse[i - 1])
101+
for i in range(n - 2, -1, -1):
102+
right[i] = min(right[i + 1], warehouse[i + 1])
103+
for i in range(n):
104+
warehouse[i] = min(warehouse[i], max(left[i], right[i]))
105+
boxes.sort()
106+
warehouse.sort()
107+
ans = i = 0
108+
for x in boxes:
109+
while i < n and warehouse[i] < x:
110+
i += 1
111+
if i == n:
112+
break
113+
ans, i = ans + 1, i + 1
114+
return ans
86115
```
87116

88117
### **Java**
89118

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

92121
```java
122+
class Solution {
123+
public int maxBoxesInWarehouse(int[] boxes, int[] warehouse) {
124+
int n = warehouse.length;
125+
int[] left = new int[n];
126+
int[] right = new int[n];
127+
final int inf = 1 << 30;
128+
left[0] = inf;
129+
right[n - 1] = inf;
130+
for (int i = 1; i < n; ++i) {
131+
left[i] = Math.min(left[i - 1], warehouse[i - 1]);
132+
}
133+
for (int i = n - 2; i >= 0; --i) {
134+
right[i] = Math.min(right[i + 1], warehouse[i + 1]);
135+
}
136+
for (int i = 0; i < n; ++i) {
137+
warehouse[i] = Math.min(warehouse[i], Math.max(left[i], right[i]));
138+
}
139+
Arrays.sort(boxes);
140+
Arrays.sort(warehouse);
141+
int ans = 0, i = 0;
142+
for (int x : boxes) {
143+
while (i < n && warehouse[i] < x) {
144+
++i;
145+
}
146+
if (i == n) {
147+
break;
148+
}
149+
++ans;
150+
++i;
151+
}
152+
return ans;
153+
}
154+
}
155+
```
156+
157+
### **C++**
158+
159+
```cpp
160+
class Solution {
161+
public:
162+
int maxBoxesInWarehouse(vector<int>& boxes, vector<int>& warehouse) {
163+
int n = warehouse.size();
164+
const int inf = 1 << 30;
165+
vector<int> left(n, inf);
166+
vector<int> right(n, inf);
167+
for (int i = 1; i < n; ++i) {
168+
left[i] = min(left[i - 1], warehouse[i - 1]);
169+
}
170+
for (int i = n - 2; ~i; --i) {
171+
right[i] = min(right[i + 1], warehouse[i + 1]);
172+
}
173+
for (int i = 0; i < n; ++i) {
174+
warehouse[i] = min(warehouse[i], max(left[i], right[i]));
175+
}
176+
sort(boxes.begin(), boxes.end());
177+
sort(warehouse.begin(), warehouse.end());
178+
int ans = 0;
179+
int i = 0;
180+
for (int x : boxes) {
181+
while (i < n && warehouse[i] < x) {
182+
++i;
183+
}
184+
if (i == n) {
185+
break;
186+
}
187+
++ans;
188+
++i;
189+
}
190+
return ans;
191+
}
192+
};
193+
```
93194
195+
### **Go**
196+
197+
```go
198+
func maxBoxesInWarehouse(boxes []int, warehouse []int) (ans int) {
199+
n := len(warehouse)
200+
left := make([]int, n)
201+
right := make([]int, n)
202+
const inf = 1 << 30
203+
left[0] = inf
204+
right[n-1] = inf
205+
for i := 1; i < n; i++ {
206+
left[i] = min(left[i-1], warehouse[i-1])
207+
}
208+
for i := n - 2; i >= 0; i-- {
209+
right[i] = min(right[i+1], warehouse[i+1])
210+
}
211+
for i := 0; i < n; i++ {
212+
warehouse[i] = min(warehouse[i], max(left[i], right[i]))
213+
}
214+
sort.Ints(boxes)
215+
sort.Ints(warehouse)
216+
i := 0
217+
for _, x := range boxes {
218+
for i < n && warehouse[i] < x {
219+
i++
220+
}
221+
if i == n {
222+
break
223+
}
224+
ans++
225+
i++
226+
}
227+
return
228+
}
229+
230+
func min(a, b int) int {
231+
if a < b {
232+
return a
233+
}
234+
return b
235+
}
236+
237+
func max(a, b int) int {
238+
if a > b {
239+
return a
240+
}
241+
return b
242+
}
94243
```
95244

96245
### **...**

solution/1500-1599/1580.Put Boxes Into the Warehouse II/README_EN.md

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,154 @@ Other valid solutions are to put the green box in room 2 or to put the orange bo
6060
### **Python3**
6161

6262
```python
63-
63+
class Solution:
64+
def maxBoxesInWarehouse(self, boxes: List[int], warehouse: List[int]) -> int:
65+
n = len(warehouse)
66+
left = [0] * n
67+
right = [0] * n
68+
left[0] = right[-1] = inf
69+
for i in range(1, n):
70+
left[i] = min(left[i - 1], warehouse[i - 1])
71+
for i in range(n - 2, -1, -1):
72+
right[i] = min(right[i + 1], warehouse[i + 1])
73+
for i in range(n):
74+
warehouse[i] = min(warehouse[i], max(left[i], right[i]))
75+
boxes.sort()
76+
warehouse.sort()
77+
ans = i = 0
78+
for x in boxes:
79+
while i < n and warehouse[i] < x:
80+
i += 1
81+
if i == n:
82+
break
83+
ans, i = ans + 1, i + 1
84+
return ans
6485
```
6586

6687
### **Java**
6788

6889
```java
90+
class Solution {
91+
public int maxBoxesInWarehouse(int[] boxes, int[] warehouse) {
92+
int n = warehouse.length;
93+
int[] left = new int[n];
94+
int[] right = new int[n];
95+
final int inf = 1 << 30;
96+
left[0] = inf;
97+
right[n - 1] = inf;
98+
for (int i = 1; i < n; ++i) {
99+
left[i] = Math.min(left[i - 1], warehouse[i - 1]);
100+
}
101+
for (int i = n - 2; i >= 0; --i) {
102+
right[i] = Math.min(right[i + 1], warehouse[i + 1]);
103+
}
104+
for (int i = 0; i < n; ++i) {
105+
warehouse[i] = Math.min(warehouse[i], Math.max(left[i], right[i]));
106+
}
107+
Arrays.sort(boxes);
108+
Arrays.sort(warehouse);
109+
int ans = 0, i = 0;
110+
for (int x : boxes) {
111+
while (i < n && warehouse[i] < x) {
112+
++i;
113+
}
114+
if (i == n) {
115+
break;
116+
}
117+
++ans;
118+
++i;
119+
}
120+
return ans;
121+
}
122+
}
123+
```
124+
125+
### **C++**
126+
127+
```cpp
128+
class Solution {
129+
public:
130+
int maxBoxesInWarehouse(vector<int>& boxes, vector<int>& warehouse) {
131+
int n = warehouse.size();
132+
const int inf = 1 << 30;
133+
vector<int> left(n, inf);
134+
vector<int> right(n, inf);
135+
for (int i = 1; i < n; ++i) {
136+
left[i] = min(left[i - 1], warehouse[i - 1]);
137+
}
138+
for (int i = n - 2; ~i; --i) {
139+
right[i] = min(right[i + 1], warehouse[i + 1]);
140+
}
141+
for (int i = 0; i < n; ++i) {
142+
warehouse[i] = min(warehouse[i], max(left[i], right[i]));
143+
}
144+
sort(boxes.begin(), boxes.end());
145+
sort(warehouse.begin(), warehouse.end());
146+
int ans = 0;
147+
int i = 0;
148+
for (int x : boxes) {
149+
while (i < n && warehouse[i] < x) {
150+
++i;
151+
}
152+
if (i == n) {
153+
break;
154+
}
155+
++ans;
156+
++i;
157+
}
158+
return ans;
159+
}
160+
};
161+
```
69162
163+
### **Go**
164+
165+
```go
166+
func maxBoxesInWarehouse(boxes []int, warehouse []int) (ans int) {
167+
n := len(warehouse)
168+
left := make([]int, n)
169+
right := make([]int, n)
170+
const inf = 1 << 30
171+
left[0] = inf
172+
right[n-1] = inf
173+
for i := 1; i < n; i++ {
174+
left[i] = min(left[i-1], warehouse[i-1])
175+
}
176+
for i := n - 2; i >= 0; i-- {
177+
right[i] = min(right[i+1], warehouse[i+1])
178+
}
179+
for i := 0; i < n; i++ {
180+
warehouse[i] = min(warehouse[i], max(left[i], right[i]))
181+
}
182+
sort.Ints(boxes)
183+
sort.Ints(warehouse)
184+
i := 0
185+
for _, x := range boxes {
186+
for i < n && warehouse[i] < x {
187+
i++
188+
}
189+
if i == n {
190+
break
191+
}
192+
ans++
193+
i++
194+
}
195+
return
196+
}
197+
198+
func min(a, b int) int {
199+
if a < b {
200+
return a
201+
}
202+
return b
203+
}
204+
205+
func max(a, b int) int {
206+
if a > b {
207+
return a
208+
}
209+
return b
210+
}
70211
```
71212

72213
### **...**
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution {
2+
public:
3+
int maxBoxesInWarehouse(vector<int>& boxes, vector<int>& warehouse) {
4+
int n = warehouse.size();
5+
const int inf = 1 << 30;
6+
vector<int> left(n, inf);
7+
vector<int> right(n, inf);
8+
for (int i = 1; i < n; ++i) {
9+
left[i] = min(left[i - 1], warehouse[i - 1]);
10+
}
11+
for (int i = n - 2; ~i; --i) {
12+
right[i] = min(right[i + 1], warehouse[i + 1]);
13+
}
14+
for (int i = 0; i < n; ++i) {
15+
warehouse[i] = min(warehouse[i], max(left[i], right[i]));
16+
}
17+
sort(boxes.begin(), boxes.end());
18+
sort(warehouse.begin(), warehouse.end());
19+
int ans = 0;
20+
int i = 0;
21+
for (int x : boxes) {
22+
while (i < n && warehouse[i] < x) {
23+
++i;
24+
}
25+
if (i == n) {
26+
break;
27+
}
28+
++ans;
29+
++i;
30+
}
31+
return ans;
32+
}
33+
};

0 commit comments

Comments
 (0)