zoukankan      html  css  js  c++  java
  • 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第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))
  • 相关阅读:
    微信app支付,服务端对接
    git 忽略文件权限
    linux 终端全局代理设置
    centos 谷歌浏览器安装
    putty快速设置本地代理
    centos rpmforge repo
    mysql 同步
    apscheduler 排程
    tornado 排程
    gedit 格式化json
  • 原文地址:https://www.cnblogs.com/tsdblogs/p/9936223.html
Copyright © 2011-2022 走看看