Algorithm 阵列中最大值最小化的分布策略

Algorithm 阵列中最大值最小化的分布策略,algorithm,Algorithm,最近,我在解决另一个问题时遇到了这个问题。我自己有一个解决办法。但我对它的时间复杂性不太满意。所以,我向你们寻求一个更好的解决方案。问题如下: 假设有一个整数数组intarr[N]。我手里有一个整数值val,要分配给arr。例如,我可以通过val增加arr[0],或者通过1和arr[3]增加val-1,依此类推。目标是使分配后arr中的最大值最小化。可能有多种解决方案,任何人都会这么做 我目前的解决办法如下。它很简单,需要O(val)时间。我觉得有更好的解决办法 for (int i = 0;

最近,我在解决另一个问题时遇到了这个问题。我自己有一个解决办法。但我对它的时间复杂性不太满意。所以,我向你们寻求一个更好的解决方案。问题如下:

假设有一个整数数组
intarr[N]
。我手里有一个整数值
val
,要分配给
arr
。例如,我可以通过
val
增加
arr[0]
,或者通过
1
arr[3]
增加
val-1
,依此类推。目标是使分配后
arr
中的最大值最小化。可能有多种解决方案,任何人都会这么做

我目前的解决办法如下。它很简单,需要
O(val)
时间。我觉得有更好的解决办法

for (int i = 0; i < val; ++i) {
  // increase the minimum value in arr by 1
}
for(int i=0;i
这里有一个线性时间算法。首先,尝试将所有内容增加到当前的最大值。如果必须继续,请尽可能均匀地分配其余内容。在未经测试的Python中:

def distribute(arr, val):
    maxarr = max(arr)
    for x in arr:
        val -= min(maxarr - x, val)
    return maxarr - (-val) // len(arr)

双减法的愚蠢之处在于得到上限分割。

这里有一个线性时间算法。首先,尝试将所有内容增加到当前的最大值。如果必须继续,请尽可能均匀地分配其余内容。在未经测试的Python中:

def distribute(arr, val):
    maxarr = max(arr)
    for x in arr:
        val -= min(maxarr - x, val)
    return maxarr - (-val) // len(arr)

双减法的愚蠢之处在于得到天花板分割。

在你的方法中,你忘记了在
arr
中寻找最小元素的复杂性,因此它是
O(val*cost\u to\u find\u min)
。要找到最小值,您可以在开始时使用堆或对元素进行排序,并尝试保持它们的平衡,等等。在您的方法中,您忘记了在
arr
中找到最小值元素的复杂性,因此它是
O(val*cost\u To\u find\u min)
。要找到最小值,您可以在开始时使用heap或对元素进行排序,并尝试保持它们的平衡,等等。