gpt4 book ai didi

algorithm - 给定一个实数列表。什么是将它们分组在一起以使组中的最大值和最小值小于 5 的好算法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:31:23 25 4
gpt4 key购买 nike

假设我有一个这样的数字列表:1,100,2,10,3,14,55,101,102,58我想要一个算法将它们组合在一起,这样

  • 组数尽量少

  • 一组内最大数与最小数之差应小于5。

其实第一个条件只是为了让问题更严谨;在我的应用程序中,数字相对分开,因此至少对于一个人来说很容易看到该组应该是什么样子。例如。在上面的例子中,它显然应该是 { [1,2,3],[10,14],[55,58],[100,101,102]}

有没有比双for循环更好的算法来解决这个问题?

谢谢!

最佳答案

我觉得你可以先把所有的数排序,然后在线性时间内贪婪地分组。假设您在名为 arr 的数组中有数字,最大和最小元素之间的差异(即您在问题陈述中提到的 5)称为 diff 并且数字数组的索引,从0开始。

n = len(arr)
sortedArr = sorted(arr)
groupStart = 0
groupsFound = [[sortedArr[0]]]
numGroups = 1
for i in range(1, n):
if sortedArr[i] - sortedArr[groupStart] >= diff:
groupStart = i
numGroups += 1
groupsFound.append([ sortedArr[i] ])
else:
groupsFound[numGroups-1].append(sortedArr[i])

我认为贪婪的方法是最优的,在这种情况下,因为每个数字都必须在一些组中。对于一个大小为n的数组,排序的复杂度为O(nlogn),分组的复杂度为O(n),使得上面代码的整体复杂度为O(nlogn)

关于algorithm - 给定一个实数列表。什么是将它们分组在一起以使组中的最大值和最小值小于 5 的好算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35862469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com