4. 寻找两个正序数组的中位数(困难)-二分查找

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))

分析

  • 每次排除k//2个函数,要比较两个数组所在k//2的位置的元素值,然后更新k值以及所在的索引值
  • 需要判断结束条件,k == 1, 另外当其中一个数组完全被排除时候
class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:

        # 寻找两个正序数组的中位数,每次排除k//2个数
        # 可以不用递归
        # 传递的参数,index1和index2不断地逼近答案

        def get_kth_element(k):
            index1, index2 = 0, 0

            while True:
                if index1 == m:
                    return nums2[index2 + k - 1]
                if index2 == n:
                    return nums1[index1 + k - 1]
                
                if k == 1:
                    return min(nums1[index1], nums2[index2])
                
                new_index1 = min(index1 + k // 2 - 1, m - 1)
                new_index2 = min(index2 + k // 2 - 1, n - 1)
                tmp1 = nums1[new_index1]
                tmp2 = nums2[new_index2]

                if tmp1 < tmp2:
                    k -= new_index1 - index1 + 1
                    index1 = new_index1 + 1
                else:
                    k -= new_index2 - index2 + 1
                    index2 = new_index2 + 1
        
        m, n = len(nums1), len(nums2)
        total_len = m + n

        if total_len % 2 == 1:
            return get_kth_element((total_len + 1)//2)
        else:
            return (get_kth_element(total_len//2) + get_kth_element(total_len//2 + 1))/2
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容