Leetcodeブラシの質問レコード-4。順序付けられた2つの配列の中央値を見つける

ここに画像の説明を挿入

私が実装した方法は次のとおりです:
最初に、特別な場合(Inputlistが空のリストなど)を除き、
それが一般的なケースの場合、
クイックソートメソッドが最初にソートされ、
次に通常のケース(両方のリストが空ではない)の場合
、2つが最初に次に、長いリスト
をこのリストに接続し
ます。長さが奇数の
場合は、len // 2の最小数を見つけます。長さが偶数の場合は、(len // 2)-1最小の数とlenを見つけます// 2つの小さな数値の平均

ここで問題は、配列のk番目に小さい数を見つける方法に移ります。
ここでは、クイックソートメソッドに基づくメソッドを使用します

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        len1 = len(nums1)
        len2 = len(nums2)
        if len1 == 0:
            if len2 & 1 == 0:#偶数
                return (nums2[len2//2]+nums2[(len2//2)-1])/2
            else:
                return nums2[len2//2]
        if len2 == 0:
            if len1 & 1 == 0:#偶数
                return (nums1[len1//2]+nums1[(len1//2)-1])/2
            else:
                return nums1[len1//2]
        sum_len = len1 + len2
        if nums1[-1] <= nums2[0] or nums2[-1] <= nums1[0]:#list1的最后一个都没有list2的第一个大
            sum_list = nums1 + nums2 if (nums1[-1] <= nums2[0]) else (nums2 + nums1)
            if sum_len & 1 == 1:#odd
                return sum_list[sum_len//2]
            else:
                return (sum_list[sum_len//2] + sum_list[(sum_len//2)-1])/2

        sum_list = nums1 + nums2 
        if sum_len & 1 == 1:#奇数长度,取sum_len//2
            val,_ = self.GetKthxiao(sum_list,sum_len//2)
            return val#self.GetKthxiao(sum_list,sum_len//2)
        elif sum_len & 1 == 0:#偶数长度
            v1,paixu1 = self.GetKthxiao(sum_list,(sum_len//2)-1)
            v2,paixu2 = self.GetKthxiao(paixu1[(sum_len//2):],0)
            return (v1+v2)/2#(self.GetKthxiao(sum_list,sum_len//2) + self.GetKthxiao(sum_list,(sum_len//2)-1))/2
        

    def swap(self,inputlist,s1,s2):
        temp = inputlist[s1]
        inputlist[s1] = inputlist[s2]
        inputlist[s2] = temp
        return inputlist

    def Partition(self,inputlist,start,end,value):
        #这个函数把inputlist里比value大的元素放其右边,把比value小的元素放其左边
        #定义:指针cur:表示当前的游标
        #定义:指针small:表示前small个数确保比value小。初值:start - 1
        #定义:指针big:表示value及其后面的数字确保比value大。初值:end + 1
        #cur从start开始

        small = start - 1
        big = end + 1
        cur = start
        length = len(inputlist)

        while cur != big:
            if inputlist[cur] > value:#当前数字大于mid数字
                big -= 1
                inputlist = self.swap(inputlist,cur,big)
            elif inputlist[cur] < value:#当前数字小于mid数字
                small += 1
                inputlist = self.swap(inputlist,cur,small)
                cur += 1
            else:
                cur += 1
        return inputlist,small+1
    def GetKthxiao(self,inputlist,K):
        length = len(inputlist)
        inputlist,index = self.Partition(inputlist,0,length-1,inputlist[0])
        #代表inputlist[:index]都比inputlist[index]小
        while True:
            if index < K:
                inputlist,index = self.Partition(inputlist,index+1,length-1,inputlist[index+1])
            elif index > K:
                inputlist,index = self.Partition(inputlist,0,index-1,inputlist[index-1])
            elif index == K:
                #代表inputlist[:K]都比inputlist[K]小
                #inputlist[K]是inputlist第K小的数字
                return inputlist[K],inputlist
43件の元の記事を公開 14 件を賞賛・2 万回以上の閲覧

おすすめ

転載: blog.csdn.net/weixin_41545780/article/details/104955585