给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。...

题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。

解题思路:

首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt]到b[bMid]的数小于等于a[aMid],b[bMid+1]到b[bEd]大于等于a[aMid],这样数组a和数组b就被划分为了两个部分,第一个部分的数小于等于a[aMid],第二部分的数大于等于a[aMid],然后统计这两个区域数的个数,个数相加等于k就返回,否则重复二分查找。
代码如下:

def binary_search(nums, n):
    if len(nums)<1:
        return -1
    low=0
    high=len(nums)-1
    mid=0
    while low <=high:
        mid=(low+high)//2
        if nums[mid]==n:
            return mid
        elif nums[mid]<n:
            low=mid+1
        else:
            high=mid-1
    return (low+high)//2


def find(nums1, nums2,k):
    if len(nums2)+len(nums1)<k:
        return -1
    if len(nums2)+len(nums1)==k:
        return max(nums1[-1],nums2[-1])
    low1=0
    high1=len(nums1)-1
    mid1=(low1+high1)//2
    mid2=binary_search(nums2,nums1[mid1])
    while mid1+mid2+2!=k:
        if mid1+mid2+2<k:
            low1=mid1+1
        else:
            high1=mid1-1
        mid1 = (low1 + high1) // 2
        mid2 = binary_search(nums2, nums1[mid1])
    return max(nums1[mid1],nums2[mid2])


nums1=[1,1,2,3,4,5]
nums2=[1,2,3,5,6]
print(find(nums1,nums2, 8))

 

转载于:https://www.cnblogs.com/tsdblogs/p/9936223.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值