Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 数组分区I(如何用数学证明这一点)_Arrays_Math - Fatal编程技术网

Arrays 数组分区I(如何用数学证明这一点)

Arrays 数组分区I(如何用数学证明这一点),arrays,math,Arrays,Math,这是leetcode提出的问题 给定一个整数数组nums的2n整数,将这些整数分组为n对(a1,b1),(a2,b2),…,(an,bn),以使所有i的min(ai,bi)之和最大化。返回最大化的总和 Input: nums = [1, 4, 3, 2] Output: 4 说明:所有可能的配对(忽略元素顺序)为: 所以最大可能的总和是4 我通过尝试多个示例解决了这个问题,并发现如果我像12 | 3 4那样对这对进行排序和排列,那么每对的最小值就是我想要的。由于数组已排序,最小值的位置是固定的

这是leetcode提出的问题

给定一个整数数组
nums
2n
整数,将这些整数分组为
n对
(a1,b1),(a2,b2),…,(an,bn)
,以使所有
i
min(ai,bi)
之和最大化。返回最大化的总和

Input: nums = [1, 4, 3, 2]
Output: 4
说明:所有可能的配对(忽略元素顺序)为:

所以最大可能的总和是4

我通过尝试多个示例解决了这个问题,并发现如果我像
12 | 3 4
那样对这对进行排序和排列,那么每对的最小值就是我想要的。由于数组已排序,最小值的位置是固定的;因此,我可以通过索引+2获得值。虽然它能工作,但它更像一个喷口。有人知道如何用数学证明这一点,从而使逻辑更加严密吗

def arrayPairSum(nums: List[int]) -> int:
    nums_sort = sorted(nums)
    res = 0
    i = 0
    while i < len(nums):
        res += nums_sort[i]
        i += 2
    return res
def arrayPairSum(nums:List[int])->int:
nums_sort=已排序(nums)
res=0
i=0
而我
您可以使用归纳法。假设您有一个排序数组
a
。最小的数字,
a[0]
将始终是它出现在任何对中的最小数。如果您选择其合作伙伴为
a[1]
,则会出现最大和,即次最小的数字。您可以通过选择另一个编号
a[m]
作为其合作伙伴来显示这一点。在这种情况下,其他对中至少有一对将具有最小的
a[1]
,根据定义,该最小值小于其他情况下的值。您可以继续将相同的参数应用于其余元素
a[2://code>

或者,您可以从另一端开始
a[-1]
保证不会出现在总和中,因为它是它将出现在任何对中的最大值。如果将其与
a[-2]
以外的任何对象配对,则总和不会最大化:一些较小的
a[m]
将表示总和中包含
a[-1]
的对,而
a[-2]
将大于与其配对的任何
a[n]
,因此不会出现在总和中

两个参数产生相同的结果:最大和超过排序数组的偶数索引

如注释中所述,以下两种实现将比原始
for
循环更有效:

def arrayPairSum(nums: List[int]) -> int:
    return sum(sorted(nums)[::2])


后者进行适当的排序,如果允许的话,可能会更快。

这不是您所要求的,但函数体可以被一行的
返回和(排序(nums)[:2])替换。
@JohnColeman。接得好
def arrayPairSum(nums: List[int]) -> int:
    return sum(sorted(nums)[::2])
def arrayPairSum(nums: List[int]) -> int:
    nums.sort()
    return sum(nums[::2])