给出一个包含m个元素的排序数组,将它们分为权重大致相等的n个存储桶。
这是我使用贪婪算法的方法:
以降序浏览数字,将每个数字分配给总和较小的子集。
因此,我有一个名为Bucket Container的自定义包装类,用于存储列表和当前列表元素的总和。我有一个优先级队列,它首先轮询最少的存储桶。因此,从最大的元素开始,我轮询权重最小的存储桶,然后将我的元素添加到该存储桶中,然后将该存储桶重新添加到优先级队列中。
class BucketContainer
{
private List<Integer> list;
private int sum;
BucketContainer()
{
sum = 0;
list = new ArrayList<Integer>();
}
void add(int val)
{
sum += val;
list.add(val);
}
List<Integer> getList()
{
return list;
}
int getSum()
{
return sum;
}
}
public List<List<Integer>> partitionElements(int[] nums, int k)
{
PriorityQueue<BucketContainer> pq = new PriorityQueue<>((i1, i2) -> {return i1.getSum() - i2.getSum();});
for (int i = 0; i < k; i++) {
pq.add(new BucketContainer());
}
for (int i = nums.length - 1; i >= 0; i--) {
BucketContainer lowestBucket = pq.poll();
lowestBucket.add(nums[i]);
pq.add(lowestBucket);
}
List<List<Integer>> result = new ArrayList();
while (!pq.isEmpty()) {
BucketContainer bucket = pq.poll();
result.add(bucket.getList());
}
return result;
}
因此,如果给定数组具有所有正整数,但不适用于具有混合整数的数组,则此方法有效。
如果数组也具有负数,则当前负数应转到权重/和最大的存储桶,而不是总和最小的存储桶(因为这将使该存储桶的权重更低)。使用一个优先级队列是不可能的。
我们如何实现同时处理正面和负面案例的问题?