第一次在leetcode上做hard级别的题目

初次尝试解决LeetCode中hard难度的'两个有序数组的中位数'问题,要求时间复杂度为O(log(m+n))。通过分析找到较短数组的中位数并逐步删除元素,实现解题。虽然代码实现过程艰辛,但最终可能达到预期的时间复杂度。学习其他高手的解决方案后,深感差距。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天第一次在LeetCode做hard级别的题目:Median of Two Sorted Arrays.

题目大意是这样的:给两个排好序的数组,让找出它们合成一个数组的时候的中位数。数组的长度分别为m,n,要求时间复杂度为O(log(m+n))。本来拿到这个题目,一眼看过去感觉有点熟悉,有点归并排序的影子。如果真是归并排序的话,这已经是最后一步。但是题目要求的时间复杂度是O(log(m+n)),而用归并的话基本上是m+n级别的。做出来不难,难的是控制这个时间复杂度。


折腾了半天,吭吭哧哧弄出一个solution,总体思路是找到较短的那个数组,找出它的中位数,然后根据该数可以每次删去较短数组长度的那么多的项,具体可以见下面代码。时间复杂度不好估计,但是应该<O(logm+logn),基本上可以认为是达到要求了吧。

我的代码:

#!/usr/bin/python
#coding=utf8
"""
# Author: qwqian
# Created Time : 2017-12-17 13:22:31

# File Name: medianOfTwoSortedArray.py
# Description:

"""

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

        if n == 1:
            if m % 2 == 0:
                if nums2[0] < nums1[m/2 - 1]:
                    return nums1[m/2 -1]
                elif nums2[0] < nums1[m/2]:
                    return nums2[0]
                else:
                    return nums1[m/2]
            else:
                if m == 1:
                    return (nums1[0] + nums2[0]) / 2.0
                else:
                    if nums2[0] < nums1[m/2 - 1]:
                        return (nums1[m/2 -1] + nums1[m/2]) / 2.0
                    elif nums2[0] < nums1[m/2 + 1]:
                        return (nums1[m/2] + nums2[0]) / 2.0
                    else:
                        return (nums1[m/2] + nums1[m/2 + 1]) / 2.0
        
        a = nums2[n/2]
        b = nums1[n/2]
        c = nums1[m - n/2 - 1]
        d = nums2[n/2-1]
        if m == n:
            b,c = c,b
        if a < b:
            nums2 = nums2[n/2 : n]
            nums1 = nums1[0 : m - n/2]
        elif a > c:
            if d < b:
                if n % 2 == 0:
                    nums2 = []
                else:
                    nums2 = [a]
            else:
                nums2 = nums2[0 : n - n/2]
                nums1 = nums1[n/2 : m]
        else:
            if d < b:
                nums2 = nums2[n/2 : n]
                nums1 = nums1[0 : m - n/2]
            else:
                nums1 = nums1[n/2 : m - n/2]
            
        return self.findMedianSortedArrays(nums1, nums2)

def main():
    nums1 = [1,2,3]
    nums2 = [4,5,6]
    solution = Solution()
    result = solution.findMedianSortedArrays(nums1, nums2)
    print result

if __name__ == "__main__":
    main()





我刷题之后习惯会看看前面高手们的解题方法,有助于打开思路提高自己,然后我看到了这个代码(排在第二):

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        all_nums = nums1 + nums2
        len_all = len(all_nums)
        all_nums.sort()
        
        if len_all == 0:
            return None
        elif len_all == 1:
            return all_nums[0]
        elif len_all == 2:
            return ((all_nums[0] + all_nums[1]) / 2.0)
        
        if len_all % 2 == 0:
            median = (all_nums[(len(all_nums) / 2)] + all_nums[(len(all_nums) / 2) - 1]) / 2.0
        else:
            median = all_nums[(len(all_nums) / 2)]
            
        return median
人用了一个Python自带的sort函数。。。。。。

内心有种日了狗的感觉。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值