Leetcode(4)寻找两个有序数组的中位数

Leetcode(4)寻找两个有序数组的中位数

[题目表述]:

给定两个大小为 m 和 n 的有序数组 nums1 和* nums2*。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1nums2 不会同时为空。

第一种方法:list拼接排列取中位数

执行用时:116 ms ; 内存消耗:11.8MB 效果:还行

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        nums1.extend(nums2)
        sort_nums1=sorted(nums1)
        number=len(sort_nums1)
        if number%2==1 :
            average_nums=sort_nums1[number/2]
        else: average_nums=float((sort_nums1[number/2]+sort_nums1[number/2-1]))/2
        return average_nums

学习

  • 整数/2在leetcode上 取整有点迷

  • 分奇偶情况

第二种方法:归并排序

执行用时:124 ms; 内存消耗:11.8MB

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        number=len(nums1)+len(nums2)
        end=number/2+1
        p1,p2=0,0
        res=[]
        while p1 < len(nums1) or p2 < len(nums2):
            if p1 >= len(nums1):
                res.append(nums2[p2])
                p2 += 1
            elif p2 >= len(nums2):
                res.append(nums1[p1])
                p1 += 1
            else:
                num1, num2 = nums1[p1], nums2[p2]
                if num1 <= num2:
                    res.append(num1)
                    p1 += 1
                else:
                    res.append(num2)
                    p2 += 1
            if len(res) == end:
                if number%2==1 :
                    mid=res[-1]
                else:
                    mid=(res[-1]+res[-2])*1.0/2
                return mid

学习

  • 对于已经排列好的数组,使用归并排序合并两个数组再找很好
posted @ 2019-10-09 23:29  黄龙士  阅读(163)  评论(0编辑  收藏  举报