已知两个长度为N的数组A,B,已分别按升序排列,求第N和N+1个数

已知两个长度为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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值