关于数字匹配问题的代码解析 | 豆包MarsCode AI刷题

87 阅读2分钟

如图所示: 屏幕截图 2024-11-22 160049.png

solution 函数分析:

X.sort(): 首先对列表 X 进行排序。排序是为了方便后续配对时,可以按照从小到大的顺序来尝试配对。

return maxpair(N, M, X): 排序后的列表 X 被传递给 maxpair 函数,并返回 maxpair 函数的结果。

maxpair 函数分析:maxpair主要使用递归,返回的是输入的列表所能配对的最大数量。

if N < 2: 
    return 0

如果传入的数字数量 N 小于2,那么无法进行配对,因此直接返回0。

pairtime = 0

初始化 pairtime 变量,用来记录当前情况下的最大配对数。

for i in range(1, N):

使用一个循环来遍历输入列表中除了第一个数字以外的所有数字。

if X[i] - X[0] >= M

检查当前遍历到的数字 X[i] 与列表中的第一个数字 X[0] 之间的差是否大于等于 M。如果是,那么它们可以配对。如果否,则i自增。

Y = X.copy()

配对成功后创建列表 X 的一个副本 Y。

Y.pop(i)
Y.pop(0)

从副本 Y 中移除当前配对的数字 X[i]和X[0]。

temp = 1 + maxpair(N - 2, M, Y)

递归调用 maxpair 函数,使用剩余的数字(N - 2)和相同的差异值 M 来尝试找到副本Y中的最大配对数。这里加1是因为已经找到了一对配对。

if temp > pairtime: 
    pairtime = temp

如果通过递归找到的配对数 temp 大于当前记录的最大配对数 pairtime,则更新 pairtime。

return pairtime

在遍历完所有可能的配对后,返回记录的最大配对数。

递归过程 递归的过程是这样的:函数 maxpair 会尝试将列表 X 的第一个数字与列表中的其他数字配对,如果配对成功,它会移除这两个数字,然后递归地调用自己来尝试配对剩余的数字。递归的每一步都会尝试找到当前情况下的最大配对数,并最终返回这个数。

然而,这个函数的实现有几个问题:

效率问题:这个函数的效率非常低,因为它尝试了所有可能的配对组合,并且对于每一种组合都进行了递归调用。时间复杂度接近于 O(N!),这对于较大的输入数据来说是非常耗时的。 不必要的复制:函数内部创建了列表的副本并进行了修改,这在每次递归调用时都会发生,进一步降低了效率。 逻辑问题:在递归调用 maxpair 之前,Y.pop(0) 会改变列表 Y 的结构,这可能会导致在后续递归调用中索引不正确。

正确的解法应该使用贪心算法。

具体代码如下:

屏幕截图 2024-11-22 160107.png