您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

算法将数组拆分为子数组,其中所有子数组中的最大和尽可能小

算法将数组拆分为子数组,其中所有子数组中的最大和尽可能小

我们可以使用二进制搜索解决此问题。

因此,假设所有子数组的最大值为x,那么,我们可以贪婪地选择O(n)中的每个子数组,以使每个子数组的总和最大且小于或等于x。创建所有子数组后,如果子数组的数量小于或等于kx则一种可能的解决方案,否则,我们增加x

代码

int start = Max_Value_In_Array;
int end = Max_Number;

while(start <= end)
   int mid = (start + end)/2;
   int subSum = 0;
   int numberOfSubArray = 1;
   for(int i = 0; i < n; i++){
      if(subSum + data[i] > mid){
          subSum = data[i];
          numberOfSubArray++;
      }else{
          subSum += data[i];
      }
   }
   if(numberOfSubArray <= k)
       end = mid - 1;
   else
       start = mid + 1;

具有k的时间复杂度O(n log k)是最大可能和。

其他 2022/1/1 18:19:38 有533人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶