鉴于以下问题,我很感激任何更正,因为我没有解决方案 对于当前的问题(取自我教授的一个考试!!!):
备注:这不是功课!
问题:
给定两个排序的数组A
(长度为n
)& B
(长度为m
),其中每个
元素(在两个数组中)是一个实数,一个数字X
(也是一个实数),
我们想知道是否存在a ∈ A
和b ∈ B
,例如:
a + b = X
,O(n+m)
运行时间。
解决方案:
首先,我们从两个数组的末尾开始检查,因为我们不需要大于X
的数字:
k = m
而A [i]> X,i = i -1
定义j = 0。
现在开始从i
中的当前A
和j
中的B
开始运行:
while i > 0 , j < k
:if A[i]+B[j] == X
,然后返回两个单元格j = j+1 , i = i -1
最后我们要么有两个元素,要么我们在一个元素中超出范围
或两个数组,这意味着确实不存在两个元素a + b = X
。
任何评论都会非常感激
谢谢
答案 0 :(得分:12)
您不应同时调整i
和j
。如果总和太大,则应减少i
。如果它太小,请增加j
。
答案 1 :(得分:4)
此问题是以下问题的特例: Find number in sorted matrix (Rows n Columns) in O(log n)
考虑填充C[i,j] = A[i] + B[j]
的矩阵,然后从其中一个角开始,如果总和太大则减少i
,如果它太小,则增加j
。
当然,您不必在程序中创建和/或填充此矩阵C
,只需假设您知道此矩阵的任何元素:它是A[i] + B[j]
,您可以随时立即计算它。生成的算法为O(m+n)
。
答案 2 :(得分:1)
我对作业也有同样的问题。 我在上网之前检查了一下。 这是我的解决方案(Python),希望一些大个子能看到并帮助我改进它
# 1.3. Given two sorted arrays a and b and number S. Find two elements such that sum a[i] + b[j] = S.Time O(n).
def find_elem_sum(alist,blist,S):#O(n)
if alist is None or alist == [] or blist is None or blist == []:
return None
# find the numbers which are less than S in the lists
#
#
# pretend it is done
a_length = len(alist)
b_length = len(blist)
a_index, b_index = 0, 0
count = 0
while alist and a_index < a_length and b_index < b_length:
count += 1
if alist[a_index] + blist[b_index] < S:
if a_index < a_length - 1:
a_index += 1
if a_index == a_length - 1:
b_index += 1;
continue
elif alist[a_index] + blist[b_index] > S:
alist = alist[:a_index]
a_length = len(alist)
a_index = a_length - 1
elif alist[a_index] + blist[b_index] == S:
return [a_index, b_index, count]
return None