leetcode -- Algorithms -- 4_ Median of Two Sorted Arrays

 

00

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

 

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        new_list = []
        median = 0.0
        l = 0

        new_list = nums1 + nums2
        l = len(new_list)
        new_list.sort()
        

        if (l%2) == 0:
            l = int(l/2)
            median = float((new_list[l-1]+new_list[l])/2)

        else:
            l = l//2
            median = new_list[l]
           
        return median

But this solution's O(n^2)

 

A simpler on of O(m+n): 

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        new_list = []
        median = 0.0
        l = 0

        while min(len(nums1),len(nums2)):
            if nums1[0]<nums2[0]:
                new_list.append(nums1[0])
                del nums1[0]
                if len(nums1)==0:
                    break
       
            if nums1[0]>nums2[0]:
                new_list.append(nums2[0])
                del nums2[0]
                if len(nums2)==0:
                    break

            else:
                new_list.append(nums1[0])
                new_list.append(nums2[0])
                del nums1[0]
                del nums2[0]
                if len(nums1)==0 or len(nums2)==0:
                    break
            
             
                
        if len(nums1):
             for i in range(len(nums1)):
                 new_list.append(nums1[i])
        if len(nums2):
            for i in range(len(nums2)):
                new_list.append(nums2[i])

        l = len(new_list)

 
        if (l%2) == 0:
            l = int(l/2)
            median = float((new_list[l-1]+new_list[l])/2)

                
        else:
            l = l//2
            median = new_list[l]
       
        return median
                
 

 

Debug experiece:

1-- 

Version 0.0:

 while len(nums1) & len(nums2):
            if nums1[0]<nums2[0]:
                new_list.append(nums1[0])
                del nums1[0]
                if len(nums1)==0:
                    break
           ............

 

 

Please becareful about using & or 'and' in python:

>>> 1&2
0
>>> 2&4
0
>>> 3&4
0
>>> 1&1
1
>>> 2 and 1
1
>>> 2 and 3
3

 You can find the calculation is processing with binary code. 

 

Version 0.1 :

 while min(len(nums1),len(nums2)):
            if nums1[0]<nums2[0]:
                new_list.append(nums1[0])
                del nums1[0]
##                if len(nums1)==0:
##                    break
       
            if nums1[0]>nums2[0]:
                new_list.append(nums2[0])
                del nums2[0]
##                if len(nums2)==0:
##                    break

            else:
                new_list.append(nums1[0])
                new_list.append(nums2[0])
                del nums1[0]
                del nums2[0]
##                if len(nums1)==0 or len(nums2)==0:
##                    break
            
             

 

When you try to running with test cases: [], [2,3,4]

it will show the error mentioning about out of index__but it's fine to run with python shell. Seems in leetcode, it will run the codes without checking the criterial. 

 

Solution_Recursive Approach

def median(A, B):
    m, n = len(A), len(B)
    if m > n:
        A, B, m, n = B, A, n, m
    if n == 0:
        raise ValueError

    imin, imax, half_len = 0, m, (m + n + 1) / 2
    while imin <= imax:
        i = (imin + imax) / 2
        j = half_len - i
        if i < m and B[j-1] > A[i]:
            # i is too small, must increase it
            imin = i + 1
        elif i > 0 and A[i-1] > B[j]:
            # i is too big, must decrease it
            imax = i - 1
        else:
            # i is perfect

            if i == 0: max_of_left = B[j-1]
            elif j == 0: max_of_left = A[i-1]
            else: max_of_left = max(A[i-1], B[j-1])

            if (m + n) % 2 == 1:
                return max_of_left

            if i == m: min_of_right = B[j]
            elif j == n: min_of_right = A[i]
            else: min_of_right = min(A[i], B[j])

            return (max_of_left + min_of_right) / 2.0

 

More details :

https://discuss.leetcode.com/topic/4996/share-my-o-log-min-m-n-solution-with-explanation/2

 

Analysis in Chinese:

http://blog.csdn.net/hk2291976/article/details/51107778

转载于:https://www.cnblogs.com/Shareishappy/p/7506935.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值