题解
问题概述
小 F 拥有一串数字,需按照以下规则将这些数字两两配对:
- 数字对中两个数字的差的绝对值必须大于等于给定的差异值
M。 - 每个数字只能被配对一次,不能出现在多个数字对中。 目标是找出最多能配对出多少对数字。
解题思路
为了最大化配对数,采取贪心策略:
- 排序:首先对数字列表
X进行排序,以便于后续配对时能够高效地找到满足条件的数字对。 - 双指针方法:
- 题目中要求数字两两配对并且不能重复,因此最多的配对个数为,因为数组是有序的。最优的情况一定是其中一个数字来自数组的左半部分,另一个数字来自右半部分
- 将列表分为两部分,左指针
l指向较小的数字,右指针r从中间开始指向较大的数字。遍历右指针,尝试找到与左指针指向的数字差值至少为M的配对。如果差值小于M,那么继续移动右指针。
- 终止条件:当左指针超过中间位置,停止配对过程。
代码解析
def solution(N: int, M: int, X: list) -> int:
res = 0
X.sort() # 对列表进行排序
l = 0 # 初始化左指针
for r in range(N // 2, N): # 右指针从中间开始遍历
if X[r] - X[l] >= M and l < N // 2:
res += 1 # 成功配对,计数器加一
l += 1 # 移动左指针,确保数字只被使用一次
return res
时间复杂度
- 排序的时间复杂度为
O(N log N)。 - 空间复杂度
O(1)