当前位置: 首页 > 知识库问答 >
问题:

将整数数组划分为 K 组,以便每个组具有最小范围

诸葛亮
2023-03-14

所以,更正式地说,我得到了N个数字,需要把它们分成K个组,这些组中没有一个是空的。每组范围的总和需要最小。例如:

N = 4,K = 2,输入为{5,3,1,1}。

一种可能的解决方案是 {5,3},{1,1}。范围的总和为 2 ((5-3) (1-1))。

另一种方法是{1,1,3}{5},它也是2((3-1)(单个数字的范围是0)。

范围始终是组中最大数字和最小数字之间的差值。

当我搜索互联网时,很明显我需要使用动态编程,但我得到的只是K=2的解决方案。

有人能帮忙吗?

共有3个答案

丁翊歌
2023-03-14

因此,在这个问题上,我们希望最小化组的范围。

所以假设我们有数组A={1,3,5,7,5,2}

每个数组中的最大范围是max[a]-min[a],最小范围0

我们可以使用二分搜索法的一个变型来寻找最小范围,这个答案是有限制的,即组必须包含连续的数字。

对于二进制搜索,我们需要选择由数组的最小和最大范围给出的边界。

这个psuedo/java代码看起来像这样。

main(){
  int upper = max(A)-min(A); 
  int lower = 0;  


  while (true) {
    int mid =  upper-lower;  
    int blocks = calculateBlockCount(A, mid); 
    if (blocks < K) {
      upper = mid - 1;
    } 
    else if (blocks > K) {
      lower = mid + 1;
    } 
    else {
      return upper;
      break;
    }
  }
 }

    private static int calculateBlockCount(int[] array, int range) {
      int count = 0;
      int[] dumie_array;
      int dumie_array[].add[array[0]];

      for (int i = 0; i < array.length; i++) {
        int dumie_array[].add[array[i]]
         if (Func_range(dumie_array) > range) {
           count++;
           dumie_array = array[i];
         } 
         else {
           dumie_array.add(array[i]);
         }
      }
      return count;
    }

    private static int Func_range(int[] input) {
       int range = 0;
       range= max(input)-min(input)
       return sum;
     }

希望stil能帮上忙

我认为这大部分在java中是可行的,只有C语言中的add功能是不存在的。(不想通过创建数组列表来写这么多。)但是我觉得节目的思路应该是清晰的。< br >这都是基于这个帖子需要算法搜索最小大和的解释。这是一个非常相似的问题。

干杯,吉斯

刘野
2023-03-14

通过动态编程,你想出了k = 2的解决方案。现在想想怎么把它推广到k = 3。

假设f2(n)返回k=2和前n个数字的最优解,f3(n)=f2(n-m)err(n-m, n)。这是扩展它的一种方法。

长孙燕七
2023-03-14
  1. 对数组排序
  2. 设am为数组的mth元素;然后,设am=am∀米∈ [1;N)。减法循环必须向后运行,以避免改变am–1.a0≡ 0。
  3. 对结果数组进行排序,保持元素的初始索引与元素本身的排序顺序相同
  4. 以最后的K–1索引为例:这些索引加上0,是搜索组的第一个元素的索引
 类似资料:
  • 我一直陷在这个问题中,找不到有效的解决办法。 我有N(高达1000万)说最大100个元素的数组。这些数组包含1-10000的数字。 现在我的问题是将这些数组划分为K个组,这样我就可以最小化所有数组中的重复项,即一个数组包含1,4,10,100,另一个数组包含1100。我希望他们进入同一组,因为这样可以最大限度地减少口是心非。我的问题的两个限制条件如下- > 组中向量的数量应均匀分布。 根据大小以递

  • 如何将整数数组划分为N个子集,使这些子集的和最小? 例如,数组由11个元素组成,我需要其中的6个子集。 子集:<code>{2,1,1,3},{4},}4,3},}3,2},1,2},{3}</code>最小和=7。 另一个答案是:最小和=7。 注意:在分区时,必须保持数字在原始集合中出现的顺序。

  • 该问题给出了两个输入:数组(arr)和由数组构成子数组的次数(n)。子数组的和应该是奇数 已经很清楚,如果所有的数字都是偶数。奇数和子数组是不可能的。对于奇数和,连续的2个数字应该是奇数+偶数或者偶数+奇数。但我似乎不能把它们分成N个子数组。请帮忙解释一下逻辑。

  • 问题内容: 我有两个值: [3:6] 我试图在Golang中玩一些游戏,但是我找不到能够根据这些值创建数组的好方法。 我要实现的目标是: 问题答案: 您可以利用该构造使其更紧凑甚至更快: 出于好奇,可以在不使用循环变量的情况下实现循环,但是这样会更慢,并且代码也更长。通过递减: 或递增:

  • 给定一个< code>n数和sum 的列表,将这些数分成< code >两个组,使得每组中的数之和小于或等于s。如果可以分组,则打印< code>YES,如果不能分组,则打印< code>NO。 例如,如果< code>n=3,s=4和< code>n数是< code>2,4,2。在这种情况下,输出为< code>YES,因为可以形成两个组< code>(2,2)和(4)。 我的解决方案如下。 是