260数字匹配问题

题解

问题概述

小 F 拥有一串数字,需按照以下规则将这些数字两两配对:

  1. 数字对中两个数字的差的绝对值必须大于等于给定的差异值 M
  2. 每个数字只能被配对一次,不能出现在多个数字对中。
    目标是找出最多能配对出多少对数字。

解题思路

为了最大化配对数,采取贪心策略:

  1. 排序:首先对数字列表 X 进行排序,以便于后续配对时能够高效地找到满足条件的数字对。
  2. 双指针方法
    • 题目中要求数字两两配对并且不能重复,因此最多的配对个数为$\lfloor \frac{n}{2} \rfloor$,因为数组是有序的。最优的情况一定是其中一个数字来自数组的左半部分,另一个数字来自右半部分
    • 将列表分为两部分,左指针 l 指向较小的数字,右指针 r 从中间开始指向较大的数字。遍历右指针,尝试找到与左指针指向的数字差值至少为 M 的配对。如果差值小于M,那么继续移动右指针。
  3. 终止条件:当左指针超过中间位置,停止配对过程。

代码解析

1
2
3
4
5
6
7
8
9
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)

260数字匹配问题
https://kongshuilinhua.github.io/2024/12/29/260数字匹配问题/
作者
FireFLy
发布于
2024年12月29日
许可协议