给定一个整数数组,编写一个返回所有唯一对的方法,最多可加100个。
示例数据:
sample_data = [0, 1, 100, 99, 0, 10, 90, 30, 55, 33, 55, 75, 50, 51, 49, 50, 51, 49, 51]
sample_output = [[1,99], [0,100], [10,90], [51,49], [50,50]]
本周末我解决了这个问题,虽然我的解决方案似乎具有可扩展性和高效性,但我想确定解决方案的最坏情况时间复杂度是什么?
这是我的解决方案:
def solution(arr)
res = []
h = Hash.new
# this seems to be O(N)
arr.each do |elem|
h[elem] = true
end
# how do I determine what Time complexity of this could be?
arr.each do |elem|
if h[100-elem]
h[100-elem] = false
h[elem] = false
res << [elem, 100-elem]
end
end
res
end
如果两个循环都是O(N),我将它们加起来:O(N + N),这将等于O(2N)并将2作为常数,我可以假设我的解决方案是O (N)?
答案 0 :(得分:4)
你是对的。如果考虑散列搜索/插入的分摊运行时,此代码的Big-O将为O(n)
。
如果您采用哈希搜索/插入(O(n)
)的最坏情况,那么它将是O(n^2)
。
答案 1 :(得分:0)
问题可能是询问哈希的时间复杂度,但对于特定问题,该哈希将更好地实现为由输入0..sum索引的bool数组(在本例中为100)。这将具有最佳,最差和平均情况下的恒定时间。
这种方法可以更简单地计算O(N)的复杂度。