美文网首页
中位数问题

中位数问题

作者: madao756 | 来源:发表于2020-03-12 11:27 被阅读0次

0X00 总结

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:

        def findKth(left1, left2, k):
            if left1 == len(nums1): return nums2[left2 + k - 1]
            if left2 == len(nums2): return nums1[left1 + k - 1]
            if k == 1: return min(nums1[left1], nums2[left2])
            halfK = k // 2
            mid1, mid2 = left1 + halfK - 1, left2 + halfK - 1
            if mid1 >= len(nums1):
                return findKth(left1,mid2+1, k - halfK)
            elif mid2 >= len(nums2):
                return findKth(mid1+1, left2, k - halfK)
            
            if nums1[mid1] >= nums2[mid2]:
                return findKth(left1, mid2+1, k - halfK)
            else:
                return findKth(mid1+1, left2, k - halfK) 

        sums = len(nums1) + len(nums2) 
        if sums & 1 == 0:
            # 偶数
            return (findKth(0, 0, sums // 2) + findKth(0, 0, sums // 2 + 1)) / 2
        else:
            return findKth(0, 0, sums // 2 + 1)

二分法去做, 每次删除一个列表的元素

最大堆与最小堆去做, 保持两个堆之间的流动性

class MedianFinder:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.minHeap = []
        self.maxHeap = []

    def addNum(self, num: int) -> None:
        # 只要涉及插入就必须保持数据在两个堆之间的流动
        # 只要我选择
        # 长度相等的时候插入最大堆, 长度不等的时候插入最小堆,就能保证两堆不会超过 1
        if len(self.minHeap) == len(self.maxHeap):
            heapq.heappush(self.maxHeap, -heapq.heappushpop(self.minHeap, num))
        else:
            heapq.heappush(self.minHeap, -heapq.heappushpop(self.maxHeap, -num))

    def findMedian(self) -> float:
        if len(self.minHeap) == len(self.maxHeap):
            return (self.minHeap[0] - self.maxHeap[0]) / 2
        else:
            return -self.maxHeap[0] 

相关文章

  • 二分查找类题目小结

    问题的关键所在 两个中位数 区间选择 终止条件 两个中位数 下位中位数 上位中位数 区间的选择 开区间 闭区间 半...

  • 中位数问题

    0X00 总结 4. Median of Two Sorted Arrays 二分法去做, 每次删除一个列表的元素...

  • LeetCode之Minimum Moves to Equal

    问题: 方法:首先,数学上中位数就存在距离和最小的特点,所以找出中位数然后遍历所有元素和中位数的距离和即得到最终结...

  • 数学问题——中位数

    知识点 输出格式问题 如果没有特殊的格式要求,直接 cout 即可 代码

  • 【LeetCode 】: 295. 数据流的中位数

    53. 最大子序和 问题描述: 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如...

  • 中位数的近似计算

    的公式求出中位数所在组的位置,然后再按下限公式或上限公式确定中位数。 Me——中位数;L——中位数所在组下限;U—...

  • Lintcode-中位数

    问题描述: 给定一个未排序的整数数组,找到其中位数。中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序...

  • 【流式数据】求数据流中的中位数

    源自《剑指offer》第63题 问题描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就...

  • [LeetCode] Median of Two Sorted

    经典问题 问题两个有序array的中位数,需要用时O(log (m+n))。 例子nums1 = [1, 3],n...

  • 295. 数据流的中位数

    中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 ...

网友评论

      本文标题:中位数问题

      本文链接:https://www.haomeiwen.com/subject/lwgyjhtx.html