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或对元素进行排序,并尝试保持它们的平衡,等等。