我试图澄清如何计算以下情况的O(n):
给定一个排序数组,你如何找到两个数字,其总和等于给定数字x的O(n)?
O(n)解决方案将是:
这是最糟糕的情况O(n),因为你只需要对数组进行一次传递。
O(n * log n)解决方案是:
这是O(n log n)因为您需要在最坏的n / 2次运行二进制搜索(log n),给出O(n / 2 * log n),其中大O是O(n * log) n)的
这是对的吗?
答案 0 :(得分:2)
是的,对于这两种算法,你的分析是正确的。
你的第一个算法也使用O(n)空间,也就是hashmap的coz。你可以避免这种情况。
Algo :
1. Consider begin = 0, and end = last_index
2. Consider data[begin] and data[end]
3. If data[begin] + data[end] > req_sum:
end=end - 1 // u need to decrease ur total sum
elif data[begin] + data[end] < req_sum:
begin = begin + 1 // u need to increase ur total sum
elif data[begin] + data[end] == req_sum:
print("found")
4. Continue from Step 2.
显然避免end < begin
和其他角落案件的情况。
答案 1 :(得分:1)
在某些课程中,这听起来像是家庭作业的问题。我不会为你解决这个问题 - 虽然很容易在网上找到解决方案 - 但我会告诉你我99%肯定你的解决方案必须花费O(n)时间作为最坏情况的复杂性即可。基于散列的解决方案每次查找只需要O(1)时间平均。