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

Posted tanshoudong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第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))

 

以上是关于给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。的主要内容,如果未能解决你的问题,请参考以下文章

动态规划专题——数位DP

Leetcode-两个排序数组的中位数

“双指针的巧妙”——剑指 Offer II 006. 排序数组中两个数字之和

快速排序的Python 简单实现

给定数组和一个常量,从数组中找到两个数之和等于常量,如何做最快

编程之美2.12 高速寻找满足条件的两个数