装包裹的最小浪费空间
难度:
标签:
题目描述
代码结果
运行时间: 183 ms, 内存: 35.2 MB
/*
* 思路:
* 1. 对packages和boxes的每个供应商的箱子分别进行排序。
* 2. 使用Java Stream API来处理每个供应商的箱子,计算最小浪费空间。
* 3. 对于每个包裹,找到能容纳它的最小箱子。
* 4. 累计每个箱子的浪费空间,最后取最小浪费空间。
* 5. 如果存在无法放入的包裹,返回-1。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class MinWasteSpaceStream {
public int minWastedSpace(int[] packages, int[][] boxes) {
Arrays.sort(packages);
long mod = 1000000007;
long totalPackageSize = IntStream.of(packages).asLongStream().sum();
long minWaste = Arrays.stream(boxes)
.map(box -> {
Arrays.sort(box);
if (box[box.length - 1] < packages[packages.length - 1]) {
return Long.MAX_VALUE;
}
long waste = 0;
int i = 0;
for (int b : box) {
int j = i;
while (j < packages.length && packages[j] <= b) {
j++;
}
waste += (long) (j - i) * b;
i = j;
}
return waste - totalPackageSize;
})
.min()
.orElse(Long.MAX_VALUE);
return minWaste == Long.MAX_VALUE ? -1 : (int) (minWaste % mod);
}
}
解释
方法:
此题解利用前缀和和排序来最小化浪费空间。首先,对包裹数组进行排序,并计算包裹尺寸的频率(f数组)和前缀和(g数组)。然后,对于每个供应商提供的箱子,按箱子尺寸排序,使用二分查找方法寻找每个包裹可以放入的最小箱子。计算每个箱子的浪费空间并累加,最后选取浪费空间最小的供应商。如果某个供应商的最大箱子尺寸小于最大包裹尺寸,则此供应商不能装下所有包裹。该算法针对每个供应商计算浪费空间,最后返回最小值。
时间复杂度:
O(m(b log b + b log n))
空间复杂度:
O(biggest)
代码细节讲解
🦆
在题解中提到的前缀和数组`g`是如何计算的,能否详细解释其作用和计算方法?
▷🦆
题解中使用的二分查找方法是如何应用的?具体是在什么情况下使用,以及它如何帮助优化查找最小箱子尺寸?
▷🦆
题解最后的返回结果使用了模运算`(10 ** 9 + 7)`,这里的模运算是基于什么考虑?
▷