当前位置: 首页 > 面试题库 >

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

易品
2023-03-14
问题内容

假设我们有一个整数数组:a = {2,4,3,5}

我们有k = 3。

我们可以将数组a拆分为k(3)个子数组,其中数组的顺序无法更改。每个子阵列的总和必须尽可能低,以使所有子阵列之间的最大总和尽可能低。

对于上述解决方案,这将给出{2,4},{3},{5},其最大和为6(4 + 2)。

错误的答案将是{2},{4、3},{5},因为在这种情况下,最大总和为7(4 + 3)。

我尝试创建一个贪心算法,该算法通过将所有int相加并将其除以子数组的结果数量来计算整个数组的平均值。因此,在上面的示例中,这意味着14/3 =
4(整数除法)。只要它小于平均数,它就会将数字加到计数器上。然后它将为子数组的其余部分重新计算。

我的解决方案给出了一个很好的近似值,可以用作启发式方法,但并不总是能给我正确的答案。

有人可以帮我解决一个算法,该算法为所有情况提供最佳解决方案,并且优于O(N²)吗?我正在寻找一种近似为O(n log n)的算法。

提前致谢!


问题答案:

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

因此,假设所有子数组的最大值为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)是最大可能和。



 类似资料:
  • 我正在寻找一个算法,可以分裂整数数组尽可能多的子数组与X的和。我试图创建数组从hi到low,但最后我只剩下2的束,不可能创建子集与奇数和。 [7,4]和剩余。

  • 我有一个数字数组,现在我必须通过生成给定数组的所有可能子数组并应用一些条件来找到元素之和。 条件是,对于每个子阵列,获取最小值,并找到其中的元素总数,然后将两者相乘(最小值*总数)。最后,将所有子阵列的所有这些相乘值相加。 以下是问题陈述: 使用下面的公式找到所有可能的子数组的总和: 和(左,右)=(最小的arr[i]) * (∑ arr[i]),其中i的范围从左到右。 例子: 子数组是:[sta

  • 我有一个子阵列: 我想将每个子数组的元素放入另一个数组中,但子数组大小的总和必须小于或等于6。所以我想得到这样的东西 我现在的代码是 我被困在这里,因为我的代码只有两个前元素。原始数组有大约1000个子数组,我的代码没有以那种形式分割它。

  • 给定一个值数组,我如何将它分成由相等元素组成的? 给定这个数组 我想要这个输出 解决这一问题的一种可能方法是创建某种索引,以指示每个元素的出现情况。 最后使用索引重建输出数组。 但是,使用此解决方案,我会丢失原始值。当然,在这种情况下,这不是一个大问题(一个值仍然存在,即使重新创建,),但我想将此解决方案应用于像这样更复杂的数据结构 实际上,我正在寻找的函数是与相反的函数 我希望我已经说清楚了,如

  • 我一直在练习算法问题,我遇到了这个问题。 给定一个数组(+VE和-VE),我必须找到一个连续的子数组,这样,和可以被任意数K整除,并且该子数组可能是最大和。对于 和,可被k整除的最大和子数组是 ,目前我所能想到的是,每个元素都有两种可能,要么包含在目标子数组中,要么不包含在目标子数组中。但这将是一个指数算法。 编辑:是否有可能在线性时间内解决这个问题。请帮忙

  • 假设数组是,现在获取此数组的所有子数组。对于每个子数组,在该子数组中找到最小值,也找到该子数组中的项目之和。最后添加所有这些值。输入无法按我想要的所有可能的子数组进行排序。 例子: 可能的子阵列包括: 最后,将所有这些值相加,得到结果=1 3 6 4 10 9=33。 约束:数组元素的范围从1到1000\u 000\u 000。数组大小从1到100\u 000。将输出作为模块7 1000\u 00