已知两个长度为N的数组A,B,已分别按升序排列
- A. 求第N和N+1个数,伪代码实现,并估算复杂度
- B. 如果你的解法时间复杂度为O(logN),请考虑时间复杂度更低的算法。
def find_num():
iter_a = [1, 2, 3, 4, 5, 6, 10, 12, 14, 15, 18, 20, 22, 23, 24, 25, 34, 45, 51, 52, 55, 59, 61, 65, 69, 72]
iter_b = [4, 8, 9, 10, 11, 12, 13, 14, 21, 23, 24, 27, 29, 31, 32, 35, 37, 39, 41, 43, 46, 47, 49, 54, 57, 59]
# iter_a = [1, 2, 3, 4, 5, 6, 10]
# iter_b = [4, 8, 9, 10, 11, 12, 13]
# iter_a = [0, 2, 4, 6, 8, 10, 12]
# iter_b = [1, 3, 5, 7, 9, 11, 13]
n = len(iter_a)
a_index = 0
b_index = 0
iter_a_first_element = iter_a[a_index]
iter_b_first_element = iter_b[b_index]
iter_a_passed_num = 0
iter_b_passed_num = 0
i = 1
while i <= n:
if iter_a_first_element <= iter_b_first_element:
a_index += 1
iter_a_passed_num += 1
if iter_a_passed_num + iter_b_passed_num == n:
print("合并后数组中第N个数为:%s" % iter_a_first_element)
print("合并后数组中第N+1个数为:%s" % min(iter_a[a_index], iter_b_first_element))
break
iter_a_first_element = iter_a[a_index]
else:
b_index += 1
iter_b_passed_num += 1
if iter_a_passed_num + iter_b_passed_num == n:
print("合并后数组中第N个数为:%s" % iter_b_first_element)
print("合并后数组中第N+1个数为:%s" % min(iter_b[b_index], iter_a_first_element))
break
iter_b_first_element = iter_b[b_index]
i += 1
t1 = Timer("find_num()", "from __main__ import find_num")
print(t1.timeit(1))
- 可以和下述方法对比耗时
def find2():
iter_a = [1, 2, 3, 4, 5, 6, 10, 12, 14, 15, 18, 20, 22, 23, 24, 25, 34, 45, 51, 52, 55, 59, 61, 65, 69, 72]
iter_b = [4, 8, 9, 10, 11, 12, 13, 14, 21, 23, 24, 27, 29, 31, 32, 35, 37, 39, 41, 43, 46, 47, 49, 54, 57, 59]
c = sorted(iter_a + iter_b)
print(c)
n = c[len(c) // 2 - 1]
n_1 = c[len(c) // 2]
print("合并后数组中第N个数为:%s" % n)
print("合并后数组中第N+1个数为:%s" % n_1)
t1 = Timer("find2()", "from __main__ import find2")
print(t1.timeit(1))