数字配对 - [Python3]

数字配对 - [Python3]

数字配对 是由 LintCode (详见 LintCode介绍)

题目描述

给出一个数组 nums,将数组中的数两两配对。
令数组 sums 为配对后每组数字的和,要求 sums 的极差最小。
请计算并返回可能的最小的 sums 的极差。
极差就是数组中最大最小值的差值。

注意事项

  • nums 长度为 n , 2 <= n <= 10^(5) 且 n 为偶数。
  • nums 中每一项 k 满足 0 <= k <= 10^(9)

示例

Input:
[2,3,5,1]
Output:
1

示例说明
将数组配对成 (2 + 3 = 5)和 (5 + 1 = 6),它们的差为 1。

代码实现

实现配对功能的关键点就在于尽可能地把所给出的数字配对相加后都取到一个“中间值”,因此对数组排序是必要的。

class Solution:

    def digitalPairing(self, nums):
        length = len(nums)
        nums.sort()
        assert length % 2 == 0
        left, right = 0, length - 1
        maximum, minimum = -float('inf'), float('inf')
        while left <= right:
            pair = nums[left] + nums[right]
            maximum = max(maximum, pair)
            minimum = min(minimum, pair)
            left += 1
            right -= 1
        
        return maximum - minimum

其中 assert 语句是判断数组长度为偶数,因为题目里已经有相关保证,所以可以把代码精简如下:

class Solution:
    """
    @param nums: the integers to be paired.
    @return: return the minimum difference of the maximum value and the minimum value after pairing.
    """
    def digitalPairing(self, nums):
        nums.sort()
        left, right = 0, len(nums) - 1
        maximum, minimum = -float('inf'), float('inf')
        while left <= right:
            pair = nums[left] + nums[right]
            maximum = max(maximum, pair)
            minimum = min(minimum, pair)
            left += 1
            right -= 1
        
        return maximum - minimum

而且这样的简化不会影响运行速度
(毕竟总是调用一次len(nums)
却使资源消耗减少了一丢丢。

感谢浏览 点个赞呗

你可能感兴趣的:(python,算法,leetcode)