Python 最小化最大差异

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

我正试图通过以下方法从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
        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)
    则直接返回
    max-min
    。因为将k加到min,从max减去k,会产生更大的差异。(准确地说,
    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,进行了一些更新。请检查是否澄清?现在我完全明白了,谢谢