LeetCode题解(python)-4. 寻找两个有序数组的中位数
2019-03-02 20:12
666 查看
版权声明:转载请注明出处,谢谢 https://blog.csdn.net/zysps1/article/details/88080625
LeetCode题解(python)
4. 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组
nums1和
nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设
nums1和
nums2不会同时为空。
示例 1:
nums1 = [1, 3] nums2 = [2] 则中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5
解题心得及思路:
本题最难的地方在于时间复杂度的要求,需要细细思考
要实现
O(log(m+n))的时间复杂度要求,见log,想到二分二分二分,最终分析有可能小于O(m)。所以设定两个变量i和j,用这两个变量分别分割数组1和数组2,将左半部分合并,将右半部分合并,左半部分的最大值小于右半部分的最小值,且左右两个部分的数量相等或者差1。数量相等时,中位数=(左边最大值+右边最小值)/2;数量差1时,左边比右边多一个,中位数等于左边最大值。
解题算法:
class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: m = len(nums1) n = len(nums2) if m>n: m,n,nums1,nums2 = n,m,nums2,nums1 imax = m imin = 0 half_ls = int((m+n+1)/2) while imin<=imax: i = int((imax+imin)/2) j = half_ls - i if i < m and nums1[i]<nums2[j-1]: imin = i + 1 elif i > 0 and nums1[i-1]>nums2[j]: imax = i - 1 else: if i == 0: max_left = nums2[j-1] elif j == 0: max_left = nums1[i-1] else: max_left = max(nums1[i-1],nums2[j-1]) if (m+n)%2 == 1: return max_left if i == m: min_right = nums2[j] elif j == n: min_right = nums1[i] else: min_right = min(nums1[i],nums2[j]) return (max_left+min_right)/2.0
相关文章推荐
- LeetCode4.python实现:寻找两个有序数组中的中位数问题☆☆☆
- 【LeetCode】第四题:寻找两个有序数组的中位数
- Python寻找两个有序数组的中位数
- [LeetCode题解]从两个有序数组的并集中寻找第k小元素
- [leetcode] Median of Two Sorted Arrays 寻找两个有序数组的中位数
- leetcode 寻找两个有序数组的中位数
- 寻找两个有序数组的中位数(LeetCode)
- Python寻找两个有序数组的中位数实例详解
- leetcode之数组类之数组的旋转与分治类-----OJ 189/33/81/153/154 数组旋转 旋转数组搜索 88 有序数组合并 4 两个有序数组寻找第K个元素/中位数 35 寻找插入位置
- [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数
- leetcode—从两个有序数组中寻找他们并集的第k小元素(思路)
- LeetCode 4. Median of Two Sorted Arrays 求两个有序数组的中位数
- LeetCode—寻找两个有序数组中值
- 【LeetCode】4. Median of Two Sorted Arrays两个有序数组的中位数
- Median of Two Sorted Arrays 两个有序数组的中位数@LeetCode
- [转载]寻找两个有序数组中的第K个数或者中位数
- [LeetCode]4 两个有序数组的中位数
- 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
- leetcode题目 寻找两个排序数组的中位数
- [LeetCode] 求两个有序数组的中位数