两个有序数组的第k大数

这道题百度上的答案真的是各种互抄,我自己写了版?

参考链接:https://blog.csdn.net/hk2291976/article/details/51107778   思路确实很清晰!

# coding=utf-8
# 两有序数组的第k大

# 一种思路是用O(m+n)的空间复杂度,然后时间复杂度的话只需要O(k)吧,
# 就是从后往前扫k个就ok了

# 另一就是不需要额外的空复,然后时复O(log(m+n))
# 递归
# https://blog.csdn.net/hk2291976/article/details/51107778


a = [19, 11, 8, 7, 4, 2, 0]
b = [13, 8, 6, 3, 1]
k = 4
m, n = len(a), len(b)

def fun(a,m,b,n,k):
    if n>m:
        return fun(b,n,a,m,k)   # 反正就假定m更长
    if k==1:
        return a[0] if a[0] > b[0] else b[0]
    if k==2:
        return min(a[:1] + b[:1])
    if k == m+n:
        return a[-1] if a[-1] < b[-1] else b[-1]

    # 因为两数组可能是不定长的,所以先短的补一下
    mimest = a[-1] if a[-1] < b[-1] else b[-1]
    for i in range(m-n):
        b.append(mimest)

    c1 = k/2 + 1
    c2 = k - c1
    while c1 and c2 and c1 < m and c2 < m:
        if b[c2-1] >= a[c1] and a[c1-1] >= b[c2]: # 确保左边是大于右边的
            # 注意这里写的是a[c1-1] < b[c2-1] 因为a b两段是有序的,只需要比较这俩中
            # 更小的那一个,就是我们要的排位在k的那个!!!  这里比较容易出错!
            return a[c1-1] if a[c1-1] <= b[c2-1] else b[c2-1]
        elif a[c1] > b[c2-1]:
            c1 += 1
            c2 -= 1
        else:
            c2 += 1
            c1 -= 1

for i in range(1, m+n+1):
    print fun(a,m,b,n,i), i

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值