Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 塔楼之间的最小高度差?_Arrays_Algorithm_Data Structures_Puzzle - Fatal编程技术网

Arrays 塔楼之间的最小高度差?

Arrays 塔楼之间的最小高度差?,arrays,algorithm,data-structures,puzzle,Arrays,Algorithm,Data Structures,Puzzle,我正在看一些面试问题,我看到了这个 给出了n座塔的高度和k值。您必须将每个塔的高度增加或减少k。您需要最小化最长塔和最短塔的高度差,并输出此差 我想答案是(maxheight-k)-(minheight+k)。 我试过一些测试用例,运行良好 但我不确定,我想我遗漏了什么,是吗?假设你有三座塔,高度分别为1、4和7,k=3。根据你的推理,最佳最小差值为(7-3)-(1+3)=0。但是你怎么处理4号高塔呢?您需要增加或减少该值,因此在本例中,您可以实现的最小差值实际上是3 即使你被允许让一座塔保持在

我正在看一些面试问题,我看到了这个

给出了n座塔的高度和k值。您必须将每个塔的高度增加或减少k。您需要最小化最长塔和最短塔的高度差,并输出此差

我想答案是
(maxheight-k)-(minheight+k)
。 我试过一些测试用例,运行良好


但我不确定,我想我遗漏了什么,是吗?

假设你有三座塔,高度分别为1、4和7,k=3。根据你的推理,最佳最小差值为(7-3)-(1+3)=0。但是你怎么处理4号高塔呢?您需要增加或减少该值,因此在本例中,您可以实现的最小差值实际上是3

即使你被允许让一座塔保持在它的高度,那么例子1,5,7将推翻你的假设


我知道这并不能解决实际的最小化问题,但它确实表明它并不像你想象的那么简单。我希望这能回答您的问题“我遗漏了什么吗?”。

首先,您需要找到塔楼的平均高度。 假设高度为3,7,17,25,45,k=5 平均值为=(3+7+17+25+45)/5=97/5=19.4

现在,我们将努力使每一栋建筑接近平均高度

对于3个高度的塔,我们必须加上5个三倍,使高度=3+(3*5)=18(18比23更接近平均值)

对于7高度,我们将添加5两次=7+(2*5)=17(17比22更接近)

同样,25将变成25-5=20 45将变成45-(5*5)=20


您的身高将变为18,17,17,20,20

此方法适用于GfG练习,问题链接:

方法:

  • 从数组中查找最大、最小元素。O(n)。取平均值,平均值=(最大元素+最小元素)/2
  • 再次迭代数组,对于每个元素,检查它是否小于或大于平均值
  • 如果当前元素arr[i]小于平均值,则将“k”添加到a[i],即a[i]=a[i]+k
  • 如果当前元素arr[i]大于或等于avg,则从a[i]中减去k,即a[i]=a[i]-k
  • 从修改后的数组中再次找出最小和最大元素
  • 返回最小值(max1-min1,max2-min2),其中(max1,min1)=修改数组前的初始最大和最小元素,(max2,min2)是修改后的最大和最小元素

完整的代码可以在这里找到:

m7thon的答案解释了您的解决方案的问题,所以我将解释您如何实际解决这个问题


值得注意的一点是,对于任何给定的塔,如果您选择将其高度从hi增加到hi+k,那么您也可以增加所有较短塔的高度:这不会影响最大值(因为如果hj在这里晚了一点。这些人已经向您解释了问题并给出了解决方案。但是,我自己编写了这段代码。我编写的代码不是您应该遵循的最佳代码,但它清楚地说明了如何使用蛮力来实现这一点

set = list(map(int, input().split()))
k = int(input())
min = 999999999

for index in range(2**len(set)):

    binary = []      //probably should have used integer to binary fuction here
    while index != 0:
        remainder = index % 2
        index //= 2
        binary.append(remainder)
    while len(binary) != len(set):
        binary.append(0)
    binary.reverse()

    separateset = []
    flag = 0
    for i in range(len(binary)):
        if binary[i] == 0:
            separateset.append(set[i]+k)
        elif binary[i] == 1 and set[i]-k >= 0:
            separateset.append(set[i]-k)
        else:
            flag = 1
            break

    if flag == 0:
        separateset.sort()
        if min > separateset[-1] - separateset[0]:
            min = separateset[-1] - separateset[0]

print(min)
这是通过识别
集合
变量的所有可能子集来实现的,但只需进行一些修改。如果数字为0,则
集合
i
处的值(索引不是for循环中的
索引
)与
k
相加,否则,如果数字为1且
集合[i]-k>=0
,在
集合
中该索引处的值被k减去(现在你可以加或减
k
,反之亦然,除非你得到
+k
-k
的所有可能组合,否则这并不重要。
集合[i]-k>=0
是因为负高度没有意义,如果出现这种情况,
标志变为1并断开。但如果标志为0,则表示所有高度均为正,然后对
分隔符进行排序,然后
min
存储最大塔和最短塔之间的差值。这
min
最终具有所有差异中的最小值。

步骤1:

将所有高度按“k”递减,并按非递减顺序排序

步骤2:

我们需要将一些高度子集增加“2*k”(因为它们减少了 第1步中的“k”,因此,为了有效地将他们的身高增加“k”,我们需要 添加“2*k”)

步骤3:

显然,如果我们增加“i”高度而不增加 “i-1”那么,它将没有用处,因为最小值仍然是相同的 最大值也可能增加

步骤4:

考虑将“2*k”添加到前缀的每个元素的所有前缀。 然后计算并更新(最大-最小)值


我想这是来自gfg

@ruakh的答案可能是我在网上找到的最好的答案,它适用于大多数情况,但对于gfg上的练习问题,有少数情况会导致最小值低于0,并且该问题不允许任何高度小于0

因此,你需要一个额外的检查,其余部分几乎完全是从鲁克的答案中得到启发的

类解决方案{
int getMinDiff(int[]arr,int n,int k){
数组。排序(arr);
int ans=arr[n-1]-arr[0];
int最小值=arr[0]+k,最大值=arr[n-1]-k;
对于(int i=0;i
我还对高度进行了基于0的索引,以使其更加明显,但这可能是主观的

编辑:在一种情况下,<0检查很重要,即当数组
8154757946
k是5。t的预期答案是
set = list(map(int, input().split()))
k = int(input())
min = 999999999

for index in range(2**len(set)):

    binary = []      //probably should have used integer to binary fuction here
    while index != 0:
        remainder = index % 2
        index //= 2
        binary.append(remainder)
    while len(binary) != len(set):
        binary.append(0)
    binary.reverse()

    separateset = []
    flag = 0
    for i in range(len(binary)):
        if binary[i] == 0:
            separateset.append(set[i]+k)
        elif binary[i] == 1 and set[i]-k >= 0:
            separateset.append(set[i]-k)
        else:
            flag = 1
            break

    if flag == 0:
        separateset.sort()
        if min > separateset[-1] - separateset[0]:
            min = separateset[-1] - separateset[0]

print(min)
class Solution:
    def getMinDiff(self, arr, n, k):
        for i in range(n):
            if arr[i] < k: arr[i] += k
            else: arr[i] -= k
        result = max(arr) - min(arr)
        print('NewArr: {}\nresult: {}'.format(arr, result))
        return result