給定兩個數組,這兩個數組是排序好的,讓你求這兩個數組合到一起之後第K大的數。
阿新 • • 發佈:2018-11-09
返回 解題思路 題目 turn 中位數 max ear 給定 class
題目:給定兩個數組,這兩個數組是排序好的,讓你求這兩個數組合到一起之後第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大的數。