• 刷题——两个字符串取中位数


    话不多说,我们先看题(很久没有做题了,今天第一刷,嘻嘻嘻)

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

    请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

    你可以假设 nums1 和 nums2 不会同时为空。

    示例 1:

    nums1 = [1, 3]
    nums2 = [2]

    则中位数是 2.0
    示例 2:

    nums1 = [1, 2]
    nums2 = [3, 4]

    则中位数是 (2 + 3)/2 = 2.5


    拿到题之后,我以为是两个数组,分别取中位数然后相加除二就好了...

    好吧,我以后看题要仔细一点了...

    没什么可以说的,先来wawawa三连发,真爽

    1564146414657

    然后,我就把这两个放进一个数组然后判断奇偶性输出就OK了

    class Solution:
        def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
            lenth1 = len(nums1)
            lenth2 = len(nums2)
            lenth = lenth1 + lenth2 
            i, j = 0, 0
            p1, p2 = 0, 0
            nums = [0] * (lenth)
            if lenth1 == 0 and lenth2 == 0:
                return
            elif lenth1 == 0:
                nums = nums2
            elif lenth2 == 0:
                nums = nums1
            else:
                for index in range(lenth):
                    if nums1[i] <= nums2[j] and p1 == 0:
                        nums[index] = nums1[i]
                        if i != lenth1-1:
                            i += 1
                        else:
                            p1 = 1
                    elif nums1[i] <= nums2[j] and p1 == 1:
                        nums[index] = nums2[j]
                        if j != lenth2-1:
                            j += 1
                    elif nums1[i] > nums2[j] and p2 == 0:
                        nums[index] = nums2[j]
                        if j != lenth2 -1:
                            j += 1
                        else:
                            p2 = 1
                    else:
                        nums[index] = nums1[i]
                        if i != lenth1-1:
                            i += 1
            # print(nums)       
            if lenth%2 == 1:
                return nums[int(lenth/2)]
            else:
                return (nums[int(lenth/2)] + nums[int(lenth/2)-1])/2
    nums1 = []
    nums2 = []
    sol = Solution()
    print(sol.findMedianSortedArrays(nums1, nums2))
    

    好了,成功通过,结束了,nice!

    睡了睡了,晚安

    !!!!

    不对啊,这道题不是困难的么,我后来去看了看题解,EMMM...

    果然用到了二分查找的方法,觉得挺有意思的,把两个数组分成了4部分来查找,在这里ma一下

    将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。

    首先,让我们在任一位置 i,将 A 划分成两个部分:

          left_A             |        right_A
    A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]
    

    我们能够得到

    ​ left_A | right_A
    ​ A[0], A[1], ..., A[i-1] | A[i], A[i+1], ..., A[m-1]

    对于B也是当然

    将两个放在一起更加明显了,就有思路啦!

    把新的集合分别命名为left_part 和right_part:

          left_part          |        right_part
    A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]
    B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]
    

    median = (left_part+right_part)/2

    我们能够得出的条件:

    i+j=n+m-i-j(假设这几个部分长度相同,设n>=m,使j不为负数)

    B[j-1]<A[i] and B[j]>A[i-1]

    然后就是简单的二分查找的步骤了,这里就不多说了,直接上代码了

    class Solution:
        def findMedianSortedArrays(self, A: List[int], B: List[int]) -> float:
            m, n = len(A), len(B)
            if m == 0 and n == 0:
                return
            if n == 0:
                if m%2 == 1:
                    return A[int(m/2)]
                else:
                    return (A[int(m/2)]+A[int(m/2)-1])/2
            if m == 0:
                if n%2 == 1:
                    return B[int(n/2)]
                else:
                    return (B[int(n/2)]+B[int(n/2)-1])/2
            if m > n:
                A, B, m, n = B, A, n, m
            imin, imax, half_len = 0, m, int((m + n + 1) / 2)
            while imin <= imax:
                i = int((imin + imax) / 2)
                j = half_len - i
                if i < m and B[j-1] > A[i]:
                    imin = i + 1
                elif i > 0 and A[i-1] > B[j]:
                    imax = i - 1
                else:
                    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
            
    A = []
    B = []
    sol = Solution()
    print(sol.findMedianSortedArrays(A,B))
    

    额,连接放在下面,有兴趣的可以直接去了解,试一试
    链接:https://leetcode-cn.com/problems/two-sum/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu-b/
    来源:力扣(LeetCode)

    今天是第一天,以后继续保持!

  • 相关阅读:
    「LOJ #6500」「雅礼集训 2018 Day2」操作
    「CEOI2013」Board
    CF407B Long Path
    poj 2503 Babelfish 用trie树做
    poj 3414 Pots搜索BFS
    POJ2001 Shortest Prefixes 用trie树实现
    poj3630Phone List用trie树实现
    poj1797Heavy Transportation最大生成树
    hoj题双重筛法
    poj1338 Ugly Numbers
  • 原文地址:https://www.cnblogs.com/fanwenkeer/p/11253007.html
Copyright © 2020-2023  润新知