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

来源:互联网 发布:c语言无线循环 编辑:程序博客网 时间:2024/05/22 07:56

今天第一次在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 resultif __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函数。。。。。。

内心有种日了狗的感觉。