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

想法如下:

当数的个数为奇数时,中位数就这一堆已经排好序的数最中间那一个

当数的个数为偶数时,中位数就是中间那两个数的平均数

class Solution:
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        lis = []#将nums1和nums2重新进行排序放进lis中
        j = 0
        k = 0
        n = len(nums1)
        m = len(nums2)
        if(n == 0):#nums1为空时,直接在num2中返回
            if(m%2==0):
                i = int(m/2)
                return (nums2[i]+nums2[i-1])/2
            else:
                return nums2[int(m/2)]
        elif(m == 0):#同上理
            if(n%2==0):
                i = int(n/2)
                return (nums1[i]+nums1[i-1])/2
            else:
                return nums1[int(n/2)]
        for i in range(0,n+m):#因为nums1和num2已经分别排序好了,所以n+m的复杂度已经够用
            if(j < n and k < m):#保证下标没有越界
                if(nums1[j]<=nums2[k]):
                    lis.append(nums1[j])
                    j = j + 1
                else:
                    lis.append(nums2[k])
                    k = k + 1
            elif(j==n):#nums1已经全部放进了lis,现在只需要放nums2就行了
                lis.append(nums2[k])
                k = k + 1
            elif(k==m):#同上理
                lis.append(nums1[j])
                j = j + 1

        if((n+m)%2==0):
            i = int((n+m)/2)
            return (lis[i]+lis[i-1])/2
        else:
            return lis[int(len(lis)/2)]

'''

第一次用LeetCode,不太习惯。然后因为数据类型的问题,困扰了一会。

Python写程序的毛病多,在IDLE上写好了,放在LeetCode里面就会缩进不对。。

然后对比了一下我的答案和官方的答案。

官方给出的时间复杂度是,而我的是O(m+n)

官方给出的时间复杂度是O(1),而我的还是O(m+n)

(看错题目。。它要求复杂的是O(log(min(m,n)))。。而我就直接做了。。)

可以在两个数组里各设置一个从零开始的下标,然后也是通过对比决定下标的移动

当m+n是奇数时,就运行到i<(m+n)/2

当m+n是偶数时,就运行到i<(m+n)/2+1

这样时间会变短,空间复杂度也下降到O(1)

'''

猜你喜欢

转载自blog.csdn.net/weixin_41169182/article/details/84781568