【Leetcode】两个有序数组,求第k大的数

在这里插入图片描述
双指针:

def func(num1,num2,k):
    i,j,n = 0,0,0
    while i<len(num1) or j<len(num2):
        n += 1
        if i<len(num1) and j<len(num2):
            if num1[i] < num2[j]:
                if n == k:
                    return num1[i]
                i += 1
            else:
                if n == k:
                    return num2[j]        
                j += 1                    
        elif i<len(num1):
            if n == k:
                return num1[i]
            i += 1                
        else:
            if n == k:
                return num2[j]       
            j += 1                 


print(func([1,5,8],[2,3,4],6))

方法二:
要找第两个数组的第k大,可以找num1[k/2], 和num2[k/2],如果这俩相等,那他俩就是第k大。
比如在下面的俩数组中找第4大的,我们发现num1的第2个和num2的第2个相等,那就返回 [3] 就好了。

num1 = [1,3,5]
num2 = [2,3,4]

如果num1的第2个 > num2的第2个,那就不要num2的前俩了,因为肯定不是第4大。然后把num2剩余的元素,也就是[4]放入下一次递归,此时k = 4 - 2 = 2,因为已经排除俩了。

num1 = [1,3,5]
num2 = [1,2,4]

反之亦然,这里值得注意的是,如果k是奇数,由于python取整的原因,k/2需要改成:num1[k//2], 和num2[k-k//2]

再由于python 从0开始计数,再改成 num1[k//2-1], 和num2[k-k//2-1]

整体代码如下:

def func2(num1,num2,k):
    if k == 1:
        return min(num1[0], num2[0])
    if not num1:
        return num2[k-1]
    if not num2:
        return num1[k-1]
    k1 = k // 2
    k2 = k - k1
    if num1[k1-1] > num2[k2-1]:
        return func2(num1, num2[k2:], k-k2)
    else:
        return func2(num1[k1:], num2, k-k1)

print(func2([1,5,8],[2,3,4],6))

猜你喜欢:👇🏻
【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
【Leetcode】二分法左侧边界右侧边界模板
【Leetcode】338. 比特位计数(动态规划)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值