题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第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))