我很难在Python中找到以下功能:
给定一组数字,返回小于或等于
n的最大数,如果不存在这样的数字,则返回None。
例如,给定列表[1, 3, 7, 10]和n = 9,函数将返回7。
我正在寻找类似于TreeSet.lower的Python功能。
我可以使用另一种数据结构。一堆似乎是合适的。
O(n)解对于问题的规模来说太慢了。我在找一个O(log )的解。
背景
我在做https://www.hackerrank.com/challenges/maximise-sum。可能的值范围为1-10^14,因此使用排序列表进行二进制搜索太慢了。
我目前的想法是直接在Python的heapq支持数组上迭代。我希望可能有更多的毕达通。
发布于 2015-11-10 09:56:29
我认为您可以使用二叉树库进行以下操作:https://bitbucket.org/mozman/bintrees/src
例子:
tree = bintrees.RBTree()
In [10]: tree.insert(5,1)
In [11]: tree.insert(6,1)
In [12]: tree.insert(10,1)
tree.ceiling_item(5) -> (5,1)这个操作的复杂性是O(logN)
发布于 2015-11-10 09:48:47
nextLowest = lambda seq,x: min([(x-i,i) for i in seq if x>=i] or [(0,None)])用法:
t = [10, 20, 50, 200, 100, 300, 250, 150]
print nextLowest(t,55)
> 50我从一个相似问题中获取上面的解决方案。
发布于 2015-11-10 09:47:25
如果你不能对数组的排序做任何假设,那么我认为你能做的最好的就是O(n):
def largest_less_than(numlist, n):
answer = min(numlist, key=lambda x: n-x if n>=x else float('inf'))
if answer > n:
answer = None
return answer如果问题是在同一数据集中重复获取最大(小于)不同n值的值,那么可能有一种解决方案是使用桶分类将列表按O(n)排序,然后重复使用bisect。
https://stackoverflow.com/questions/33626880
复制相似问题