将排序数组中的m个元素划分为n个存储桶,权重近似相等

时间:2019-06-22 19:37:23

标签: arrays dynamic-programming priority-queue partition bucket

给出一个包含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;
   }

因此,如果给定数组具有所有正整数,但不适用于具有混合整数的数组,则此方法有效。

如果数组也具有负数,则当前负数应转到权重/和最大的存储桶,而不是总和最小的存储桶(因为这将使该存储桶的权重更低)。使用一个优先级队列是不可能的。

我们如何实现同时处理正面和负面案例的问题?

0 个答案:

没有答案