leetcode #4: Median of Two Sorted Arrays

题目链接: Median of Two Sorted Arrays

这道题坑还是有点多的,刚看到的时候第一反应是:这不就是归并排序....还是图样啊。所以先这样提交了:


class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        idx1 = 0
        idx2 = 0
        a = 0
        b = 0
        while idx1 + idx2 != (len(nums1) + len(nums2))//2 + 1:
        	print(idx1, idx2)
        	if idx1 == len(nums1) and idx2 < len(nums2):
        		a = b
        		b = nums2[idx2]
        		idx2+=1
        	elif idx2 == len(nums2) and idx1 < len(nums1):
        		a = b
        		b = nums1[idx1]
        		idx1+=1
        	elif idx1 == len(nums1) and idx2 == len(nums2):
        	    break
        	else:
        		if nums1[idx1] <= nums2[idx2]:
        			a = b
        			b = nums1[idx1]
        			idx1+=1
        		else:
        			a = b
        			b = nums2[idx2]
        			idx2+=1
        print '-------'
        print a, b
        if (len(nums1) + len(nums2)) % 2 == 0: 
        	return (float)(a + b)/2
        else:
        	return b

其实暴力算法也不是很好写的,会有很多坑爹的边界问题。


结果:

黑人文号.jpg

看了下别人的做法才恍然大悟..其实可以转换为找第k大的数,可以将时间复杂度从O(n)降到O(lgn):

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        n = len(nums1) + len(nums2)
    	if n % 2:
    		return self.find_kth(nums1, nums2, n//2 + 1)
    	else:
    		return float(self.find_kth(nums1, nums2, n//2) + self.find_kth(nums1, nums2, n//2 + 1)) / 2
    def find_kth(self, nums1, nums2, k):
        #print nums1, nums2, k
        len1 = len(nums1)
        len2 = len(nums2)
    	if len1 == 0:
    		return nums2[k - 1]
    	if len2 == 0:
    		return nums1[k - 1]
    	if k == 1:
    		return min(nums1[0], nums2[0])
    	idx = k//2
    	if idx > min(len1, len2):
    	    idx = min(len1, len2)
    	#print idx
    	if nums1[idx - 1] <= nums2[idx - 1]:
    		return self.find_kth(nums1[idx:], nums2, k - idx)
    	else:
    		return self.find_kth(nums1, nums2[idx:], k - idx)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值