Arrays 塔楼之间的最小高度差?
我正在看一些面试问题,我看到了这个 给出了n座塔的高度和k值。您必须将每个塔的高度增加或减少k。您需要最小化最长塔和最短塔的高度差,并输出此差 我想答案是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 即使你被允许让一座塔保持在
(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