首页 > 其他分享 >【每日一题】寻找两个正序数组的中位数

【每日一题】寻找两个正序数组的中位数

时间:2024-05-09 16:25:42浏览次数:17  
标签:return 中位数 length l2 数组 l1 正序 nums1 nums2

4. 寻找两个正序数组的中位数

给定两个大小分别为 mn 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 O(log (m+n))

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

先用python怼了个简单粗暴的解法,合并后排序:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        l = nums1 + nums2
        l.sort()
        print(l)
        length = len(l)
        if length % 2: # 奇数
            return l[length // 2]
        else:
            return (l[length // 2 - 1] + l[length // 2]) / 2

难亿点的思路是,求中位数其实就是求第 k 小的数的一种特殊情况。每次比较两个数组中第 k/2 个数的大小,把不可能的数排除,然后比较剩下的数组...直到 k=1 。

还挺多坑的,改了好几次。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:

        def getK(l1, l2, k):
            len1, len2 = len(l1), len(l2)
            if len1 > len2:
                return getK(l2, l1, k) # 确保nums1是最短的,简化代码
            if len1 == 0:
                return l2[k-1]
            if k == 1:
                return min(l1[0], l2[0])
            
            i = min(len1, k//2) - 1
            j = min(len2, k//2) - 1
            
            if l1[i] > l2[j]:
                return getK(l1[:], l2[j+1:], k-j-1)
            else:
                return getK(l1[i+1:], l2[:], k-i-1)

        len3 = len(nums1)+ len(nums2)
        return (getK(nums1, nums2, (len3+1)//2) + getK(nums1, nums2, (len3+2)//2)) * 0.5 # 这样写就不用分奇偶了

 

标签:return,中位数,length,l2,数组,l1,正序,nums1,nums2
From: https://www.cnblogs.com/Aikoin/p/18182540

相关文章

  • 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • 153. 寻找旋转排序数组中的最小值
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8......
  • JS数组常用方法
    push() -在数组末尾添加一个或多个元素,并返回新的长度。pop() -删除数组的最后一个元素,并返回那个元素。shift() -删除数组的第一个元素,并返回那个元素。unshift() -在数组的开始添加一个或多个元素,并返回新的长度。slice() -返回数组的一个浅拷......
  • 2024-05-08:用go语言,给定一个由正整数组成的数组 nums, 找出数组中频率最高的元素, 然后
    2024-05-08:用go语言,给定一个由正整数组成的数组nums,找出数组中频率最高的元素,然后计算该元素在数组中出现的总次数。输入:nums=[1,2,2,3,1,4]。输出:4。答案2024-05-08:chatgpt题目来自leetcode3005。大体步骤如下:1.创建一个空的字典cnt用于存储每个元素的出现次数。2......
  • JavaScript中指定大小分割数组的一种实现
    今天分享一个使用JavaScript分割数组为多个自数组的方法实现。我使用它的场景如下:给定一个数组arr和指定大小fixed:constarr=[ { id:1, name:'name1' }, { id:2, name:'name2' }, { id:3, name:'name3' }, { id:4, name:'name4' }, { ......
  • Linux脚本——for循环和array数组
    #!/bin/shNodeName=(k8s-master-1k8s-master-2k8s-master-3k8s-node-1k8s-node-2k8s-node-3k8s-node-4k8s-node-5)ipv4=(100.190.110.55100.190.110.56100.190.110.57100.190.110.70100.190.110.71......
  • NumPy 数组切片及数据类型介绍
    NumPy数组切片NumPy数组切片用于从数组中提取子集。它类似于Python中的列表切片,但支持多维数组。一维数组切片要从一维数组中提取子集,可以使用方括号[]并指定切片。切片由起始索引、结束索引和可选步长组成,用冒号:分隔。语法:arr[start:end:step]start:起始索引(默认......
  • NumPy 数组创建方法与索引访问详解
    NumPy创建数组NumPy中的核心数据结构是ndarray,它代表多维数组。NumPy提供了多种方法来创建ndarray对象,包括:使用array()函数array()函数是最常用的方法之一,它可以将Python列表、元组甚至其他数组转换为ndarray对象。语法:ndarray=np.array(data,dtype=dtype,o......
  • 以数组为基础实现循环队列
    /*****************************************************************name;CirQueue_Create*function:创建循环队列*parameter;unsighedintsize*ReValue;CirQueue_t**author;小北blog*attention;*date;2024.04.26*history;*version;*Copyright(c)......