ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[LeetCode] 4. Median of Two Sorted Arrays(Python)

2021-12-06 22:04:21  阅读:185  来源: 互联网

标签:return Arrays Median Two Example 数组 Input nums1 nums2


[LeetCode] 4. Median of Two Sorted Arrays(Python)

1. 题目

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.
The overall run time complexity should be O(log (m+n)).
Example 1:
Input: nums1 = [1,3], nums2 = [2] Output: 2.00000 Explanation: merged array = [1,2,3] and median is 2.

Example 2:

Input: nums1 = [1,2], nums2 = [3,4] Output: 2.50000 Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
Example 3:
Input: nums1 = [0,0], nums2 = [0,0] Output: 0.00000
Example 4:
Input: nums1 = [], nums2 = [1] Output: 1.00000
Example 5:
Input: nums1 = [2], nums2 = [] Output: 2.00000
Constraints:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106

2. 题目理解

输入两个排好序的数组,返回两个数组的中位数,时间复杂度为O(log (m+n))。

3. 代码实现

1)思路一
将两个数组混为一个数组并排序,若共有偶数位,则取两个中间值的均值,否则输出中值。

class Solution(object):
	def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        m,n = len(nums1), len(nums2)
        nums = sorted(nums1 + nums2)
        med = int((m+n)/2)
        if (m+n)%2 == 0:
            return float(nums[med-1] + nums[med]) / 2
        else:
            return float(nums[med])

分析:使用了库函数sorted(),因此时间复杂度与此库函数有关。

2)思路二
引入寻找第k小的数的函数来避免一些冗余。在getKth()函数中,所有操作在第一个数组长度小于等于第二个的逻辑上产生。若第一个数组为空,则直接输出第二个数组的第k位。若k为1,则输出两个数组第一位中较小的数。k大于1时,对两个数组的k/2位开始比较,若A[k/2]较小,则比A[k/2]小的数最多有k-2个,所以A[k/2]前的数可以被放弃,操作的数组变为(A[k/2:], B, pb),A[k/2]较大时想法类似,抛弃B数组后半部份的数。

class Solution(object):
    def getKth(self, A, B, k):
        lenA, lenB = len(A), len(B)
        if lenA > lenB: return self.getKth(B, A, k)
        if lenA == 0: return B[k - 1]
        if k == 1: return min(A[0], B[0])
        posi_a = min(k/2, lenA)
        posi_b = k - posi_a
        if A[posi_a - 1] <= B[posi_b - 1]:
            return self.getKth(A[posi_a:], B, posi_b)
        else:
            return self.getKth(A, B[posi_b:], posi_a)
    
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        len1, len2 = len(nums1), len(nums2)
        if (len1 + len2) % 2 == 1: 
            return self.getKth(nums1, nums2, (len1+len2)/2 + 1)
        else:
            return (self.getKth(nums1, nums2, (len1+len2)/2) + self.getKth(nums1, nums2, (len1+len2)/2 + 1)) * 0.5

标签:return,Arrays,Median,Two,Example,数组,Input,nums1,nums2
来源: https://blog.csdn.net/qq_35029666/article/details/121756602

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有