Leetcode 04 寻找两个正序数组中的中位数

LeetCode 4 寻找两个正序数组中的中位数
一、题目概述

​ 给定两个大小为m和n的正序数组,返回两个正序数组的中位数。

二、解法思路:

​ 最朴实的方法,从第一个开始比较,置两个指针,然后一个一个比较,谁小谁加1,直到加够。复杂度是 O ( m + n ) O(m+n) O(m+n)

​ 另外个方法:考虑一个函数,是找到第K个数,那么给定两个数组,那么就是从两个数组中找到一个这样的分割,使得在分割线左边的数量等于K。同时只要确定一个数组中分割线的位置,就可以确定另一组分割线的位置(总数K相同)。同时需要满足,左边的所有数小于右边的所有数。

在这里插入图片描述

三、代码

最朴实的代码(复杂度 O ( m + n ) O(m+n) O(m+n))

class Solution:
    def findMedianSortedArrays(self, nums1, nums2 ):
        num = 0
        min_1,min_2 = 0,0

        length = len(nums1) + len(nums2)
        while(num< (length/2+1)):
            left = nums1[0] if(len(nums1) > 0) else 10**6
            right = nums2[0] if(len(nums2) > 0) else 10**6

            if(left < right):
                min_x = left
                if (len(nums1) > 0):
                    nums1.pop(0)

            else:
                min_x = right
                if(len(nums2)>0):
                    nums2.pop(0)

            min_1 = min_2
            min_2 = min_x
            num = num + 1

        if(length % 2 !=0):
            print("奇数")
            return min_1
        else:
            print("偶数")
            return (min_1+min_2)/2

复杂度降低的代码 O ( l o g ( m + n ) ) O(log(m+n)) O(log(m+n))

class Solution:
    def findMedianSortedArrays(self, nums1, nums2 ):
        length = len(nums1)+len(nums2)
        min_list = nums1 if len(nums1)  < len(nums2) else nums2
        max_list = nums1 if len(nums1)  >= len(nums2) else nums2

        K = int(length / 2)
        start = 0
        end = len(min_list)
        while(True):
            div_1 = int((start+end)/2)
            div_2 = K - div_1 - 1

            x_i,x_i1,y_i,y_i1 = self.get_value(min_list,max_list,div_1-1,div_2)
            if (x_i > y_i1):
                end = div_1
            elif (y_i > x_i1):
                start = div_1+1
            else:
                print(x_i,x_i1)
                print(y_i,y_i1)
                if(length % 2 ==0):
                    return ( max(x_i,y_i) + min(x_i1,y_i1))/2
                else:
                    return min(x_i1,y_i1)


    def get_value(self,nums1,nums2,i,j):
        if(i<0):
            x_i = -10**6
        else:
            x_i = nums1[i]

        if( i < (len(nums1)-1)):
            x_i1 = nums1[i+1]
        else:
            x_i1 = 10**6

        if (j < 0):
            y_i = -10 ** 6
        else:
            y_i = nums2[j]

        if (j < (len(nums2) - 1)):
            y_i1 = nums2[j + 1]
        else:
            y_i1 = 10 ** 6

        return x_i,x_i1,y_i,y_i1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值