Python 最小化最大差异
我正试图通过以下方法从GFG解决这个问题:Python 最小化最大差异,python,arrays,greedy,Python,Arrays,Greedy,我正试图通过以下方法从GFG解决这个问题: class Solution: def getMinDiff(self, arr, n, k): # code here arr.sort() min_diff = arr[-1] - arr[0] if min_diff <= k: return min_diff min_ele = arr[0] + k
class Solution:
def getMinDiff(self, arr, n, k):
# code here
arr.sort()
min_diff = arr[-1] - arr[0]
if min_diff <= k:
return min_diff
min_ele = arr[0] + k
max_ele = arr[-1] - k
if min_ele > max_ele:
min_ele, max_ele = max_ele, min_ele
for i in range(1, n-1):
curr_min = arr[i] - k
curr_max = arr[i] + k
if curr_min >= min_ele or curr_max <= max_ele:
continue
if max_ele - curr_min <= curr_max - min_ele:
min_ele = curr_min
else:
max_ele = curr_max
return min(min_diff, max_ele - min_ele)
if __name__ == '__main__':
tc = int(input())
while tc > 0:
k = int(input())
n = int(input())
arr = list(map(int, input().strip().split()))
ob = Solution()
ans = ob.getMinDiff(arr, n, k)
print(ans)
tc -= 1
我无法找出我的逻辑或代码中的错误。有人能提出纠正或更好的方法吗
我无法找出我的逻辑或代码中的错误
根据您当前的逻辑,您决定仅根据当前元素添加或减去k。但它可能不会产生总的最小差异。例如,对于5,您决定添加k,结果是整个集合的范围(5,11)
。相反,如果你减去它,就会得到(1,6)
有人能提出纠正或更好的方法吗 方法:
def getMinDiff(self, arr, n, k):
# code here
arr.sort()
min_diff = arr[-1] - arr[0]
if min_diff <= k:
return min_diff
for i in range(0, n-1):
if arr[i + 1] < k :
continue
start = min(arr[0] + k, arr[i + 1] - k)
end = max(arr[-1] - k, arr[i] + k)
min_diff = min(min_diff, end - start)
return min_diff
- 对数组进行排序
- 让我们来处理这个简单的情况,
则直接返回如果k>(max-min)
。因为将k加到min,从max减去k,会产生更大的差异。(准确地说,max-min
)2*k+(最大-最小)
- 在所有其他情况下,我们将把
添加到最小元素中,并从最大元素中减去k
。数组中应该存在一个索引,从加k切换到减k。下图显示了交换机索引:k
B
可以小于D
,A
也可以大于C
)
- 现在我们迭代数组,在每个索引处,如果是开关索引,则确定范围。
- 从图表中,我们可以计算如下范围
- 如果
,则范围将以A
开始,否则以A
C
- 类似地,如果
,则范围将以B>D
结束,否则以B
结束D
- 如果
- 从图表中,我们可以计算如下范围
- 所有索引的最小
范围
给出结果
更新代码:
def getMinDiff(self, arr, n, k):
# code here
arr.sort()
min_diff = arr[-1] - arr[0]
if min_diff <= k:
return min_diff
for i in range(0, n-1):
if arr[i + 1] < k :
continue
start = min(arr[0] + k, arr[i + 1] - k)
end = max(arr[-1] - k, arr[i] + k)
min_diff = min(min_diff, end - start)
return min_diff
def getMinDiff(self、arr、n、k):
#代码在这里
arr.sort()
最小差值=arr[-1]-arr[0]
如果你能详细说明你的方法中的第三点。我也了解开关箱的概念,但它在ur代码中使用的位置?以及为什么i+1表示开始,i表示结束end@777_mahakaal,进行了一些更新。请检查是否澄清?现在我完全明白了,谢谢