Minimum Space Wasted from Packaging

For each supplier, sort boxes, then per-package binary search for the smallest fitting box and accumulate waste.

Hard
Time O((n + sum_b) log n) Space O(1)
LeetCode
6 min read
sorting binary-search prefix-sum

Problem#

Each package needs a box at least as large as itself. Each supplier provides a set of box sizes; you must pick exactly one supplier. Return the minimum total wasted space (box size minus package size summed over all packages), or -1 if no supplier can fit every package. Result is modulo 10^9 + 7.

Examples#

  • packages = [2,3,5], boxes = [[4,8],[2,8]]6 (supplier 2: 2→2 wastes 0, 3→8 wastes 5, 5→8 wastes 3)
  • packages = [3,5,8,10,11,12], boxes = [[12],[11,9],[10,5,14]]-1

Constraints#

  • 1 <= packages.length, boxes.length <= 10^5, 1 <= sum of boxes.length <= 10^5.

Approach#

Sort packages and build a prefix sum. For each supplier, sort their boxes; iterate boxes in order and, via upper_bound, find how many packages still unboxed are at most the current box size. The contribution is boxSize * count - sumOfThosePackages. Skip suppliers whose max box is smaller than the largest package.

Solution#

Minimum Space Wasted from Packaging
class Solution {
public:
int minWastedSpace(vector<int>& packages, vector<vector<int>>& boxes) {
const long MOD = 1'000'000'007;
sort(packages.begin(), packages.end());
int n = packages.size();
vector<long long> pref(n + 1, 0);
for (int i = 0; i < n; ++i) pref[i + 1] = pref[i] + packages[i];
long long best = LLONG_MAX;
for (auto& sup : boxes) {
sort(sup.begin(), sup.end());
if (sup.back() < packages.back()) continue;
long long waste = 0;
int prev = 0;
for (int b : sup) {
int idx = upper_bound(packages.begin(), packages.end(), b) - packages.begin();
if (idx > prev) {
waste += (long long)b * (idx - prev) - (pref[idx] - pref[prev]);
prev = idx;
}
}
best = min(best, waste);
}
if (best == LLONG_MAX) return -1;
return (int)(best % MOD);
}
};

Editorial#

The packages-sorted plus prefix-sum trick converts each “boxes of size at most b waste” sub-question into O(log n). Each supplier processes its boxes in increasing order and “claims” the next slab of packages. Total work across all suppliers is bounded by total boxes, since each box is iterated once.

Complexity#

  • Time: O((n + sum_b) log n).
  • Space: O(n).

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.