|
69 | 69 |
|
70 | 70 | <!-- 这里可写通用的实现逻辑 -->
|
71 | 71 |
|
| 72 | +**方法一:预处理 + 排序 + 双指针** |
| 73 | + |
| 74 | +我们可以先对仓库的房间进行预处理,得到一个数组 $left$,其中 $left[i]$ 表示下标 $i$ 可以放入的最大箱子高度。 |
| 75 | + |
| 76 | +然后对箱子的高度进行排序,从小到大依次放入仓库中。我们使用两个指针 $i$ 和 $j$ 分别指向箱子的第一个位置以及仓库的最后一个位置,如果 $left[j] \lt boxes[i]$,说明当前仓库无法放入箱子 $i$,我们将指针 $j$ 循环向左移动,直到 $left[j] \ge boxes[i]$ 或者 $j \lt 0$。如果此时 $j \lt 0$,说明仓库已经没有空间可以放入箱子 $i$,我们可以直接退出循环。否则说明仓库可以放入箱子 $i$,我们将指针 $i$ 循环向右移动,指针 $j$ 循环向左移动。继续进行上述操作,直到指针 $i$ 超出箱子的范围。 |
| 77 | + |
| 78 | +最后我们返回指针 $i$ 的值即可。 |
| 79 | + |
| 80 | +时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为仓库的房间数。 |
| 81 | + |
72 | 82 | <!-- tabs:start -->
|
73 | 83 |
|
74 | 84 | ### **Python3**
|
75 | 85 |
|
76 | 86 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
77 | 87 |
|
78 | 88 | ```python
|
79 |
| - |
| 89 | +class Solution: |
| 90 | + def maxBoxesInWarehouse(self, boxes: List[int], warehouse: List[int]) -> int: |
| 91 | + n = len(warehouse) |
| 92 | + left = [warehouse[0]] * n |
| 93 | + for i in range(1, n): |
| 94 | + left[i] = min(left[i - 1], warehouse[i]) |
| 95 | + boxes.sort() |
| 96 | + i, j = 0, n - 1 |
| 97 | + while i < len(boxes): |
| 98 | + while j >= 0 and left[j] < boxes[i]: |
| 99 | + j -= 1 |
| 100 | + if j < 0: |
| 101 | + break |
| 102 | + i, j = i + 1, j - 1 |
| 103 | + return i |
80 | 104 | ```
|
81 | 105 |
|
82 | 106 | ### **Java**
|
83 | 107 |
|
84 | 108 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
85 | 109 |
|
86 | 110 | ```java
|
| 111 | +class Solution { |
| 112 | + public int maxBoxesInWarehouse(int[] boxes, int[] warehouse) { |
| 113 | + int n = warehouse.length; |
| 114 | + int[] left = new int[n]; |
| 115 | + left[0] = warehouse[0]; |
| 116 | + for (int i = 1; i < n; ++i) { |
| 117 | + left[i] = Math.min(left[i - 1], warehouse[i]); |
| 118 | + } |
| 119 | + Arrays.sort(boxes); |
| 120 | + int i = 0, j = n - 1; |
| 121 | + while (i < boxes.length) { |
| 122 | + while (j >= 0 && left[j] < boxes[i]) { |
| 123 | + --j; |
| 124 | + } |
| 125 | + if (j < 0) { |
| 126 | + break; |
| 127 | + } |
| 128 | + ++i; |
| 129 | + --j; |
| 130 | + } |
| 131 | + return i; |
| 132 | + } |
| 133 | +} |
| 134 | +``` |
| 135 | + |
| 136 | +### **C++** |
| 137 | + |
| 138 | +```cpp |
| 139 | +class Solution { |
| 140 | +public: |
| 141 | + int maxBoxesInWarehouse(vector<int>& boxes, vector<int>& warehouse) { |
| 142 | + int n = warehouse.size(); |
| 143 | + int left[n]; |
| 144 | + left[0] = warehouse[0]; |
| 145 | + for (int i = 1; i < n; ++i) { |
| 146 | + left[i] = min(left[i - 1], warehouse[i]); |
| 147 | + } |
| 148 | + sort(boxes.begin(), boxes.end()); |
| 149 | + int i = 0, j = n - 1; |
| 150 | + while (i < boxes.size()) { |
| 151 | + while (j >= 0 && left[j] < boxes[i]) { |
| 152 | + --j; |
| 153 | + } |
| 154 | + if (j < 0) { |
| 155 | + break; |
| 156 | + } |
| 157 | + ++i; |
| 158 | + --j; |
| 159 | + } |
| 160 | + return i; |
| 161 | + } |
| 162 | +}; |
| 163 | +``` |
| 164 | +
|
| 165 | +### **Go** |
| 166 | +
|
| 167 | +```go |
| 168 | +func maxBoxesInWarehouse(boxes []int, warehouse []int) int { |
| 169 | + n := len(warehouse) |
| 170 | + left := make([]int, n) |
| 171 | + left[0] = warehouse[0] |
| 172 | + for i := 1; i < n; i++ { |
| 173 | + left[i] = min(left[i-1], warehouse[i]) |
| 174 | + } |
| 175 | + sort.Ints(boxes) |
| 176 | + i, j := 0, n-1 |
| 177 | + for i < len(boxes) { |
| 178 | + for j >= 0 && left[j] < boxes[i] { |
| 179 | + j-- |
| 180 | + } |
| 181 | + if j < 0 { |
| 182 | + break |
| 183 | + } |
| 184 | + i, j = i+1, j-1 |
| 185 | + } |
| 186 | + return i |
| 187 | +} |
| 188 | +
|
| 189 | +func min(a, b int) int { |
| 190 | + if a < b { |
| 191 | + return a |
| 192 | + } |
| 193 | + return b |
| 194 | +} |
| 195 | +``` |
87 | 196 |
|
| 197 | +### **TypeScript** |
| 198 | + |
| 199 | +```ts |
| 200 | +function maxBoxesInWarehouse(boxes: number[], warehouse: number[]): number { |
| 201 | + const n = warehouse.length; |
| 202 | + const left: number[] = new Array(n); |
| 203 | + left[0] = warehouse[0]; |
| 204 | + for (let i = 1; i < n; ++i) { |
| 205 | + left[i] = Math.min(left[i - 1], warehouse[i]); |
| 206 | + } |
| 207 | + boxes.sort((a, b) => a - b); |
| 208 | + let i = 0; |
| 209 | + let j = n - 1; |
| 210 | + while (i < boxes.length) { |
| 211 | + while (j >= 0 && left[j] < boxes[i]) { |
| 212 | + --j; |
| 213 | + } |
| 214 | + if (j < 0) { |
| 215 | + break; |
| 216 | + } |
| 217 | + ++i; |
| 218 | + --j; |
| 219 | + } |
| 220 | + return i; |
| 221 | +} |
88 | 222 | ```
|
89 | 223 |
|
90 | 224 | ### **...**
|
|
0 commit comments