Arrays 数组分区I(如何用数学证明这一点)
这是leetcode提出的问题 给定一个整数数组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那样对这对进行排序和排列,那么每对的最小值就是我想要的。由于数组已排序,最小值的位置是固定的
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])