精华内容
下载资源
问答
  • 4. 寻找两个有序数组中位数 有序数组中求第N大,求中位数题目解答 两个有序数组找相同的数字没想法,感觉只想到建立一个哈希表,然后另一个数组去查查自己在不在哈希表中,有序的话还可以利用下元素大小,如果查...

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

    有序数组中求第N大,求中位数题目解答

    两个有序数组找相同的数字没想法,感觉只想到建立一个哈希表,然后另一个数组去查查自己在不在哈希表中,有序的话还可以利用下元素大小,如果查到的某个元素已经大于了第一个有序数组的最后一个元素,就不用再往后查了。

    展开全文
  • Java实现 LeetCode 4 寻找两个有序数组中位数

    万次阅读 多人点赞 2020-02-11 18:54:06
    请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3,...
    1. 寻找两个有序数组的中位数

    给定两个大小为 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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    PS:

    这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O(log (m+n)),看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。那么回顾一下中位数的定义,如果某个有序数组长度是奇数,那么其中位数就是最中间那个,如果是偶数,那么就是最中间两个数字的平均值。这里对于两个有序数组也是一样的,假设两个有序数组的长度分别为m和n,由于两个数组长度之和 m+n 的奇偶不确定,因此需要分情况来讨论,对于奇数的情况,直接找到最中间的数即可,偶数的话需要求最中间两个数的平均值。为了简化代码,不分情况讨论,我们使用一个小trick,我们分别找第 (m+n+1) / 2 个,和 (m+n+2) / 2 个,然后求其平均值即可,这对奇偶数均适用。加入 m+n 为奇数的话,那么其实 (m+n+1) / 2 和 (m+n+2) / 2 的值相等,相当于两个相同的数字相加再除以2,还是其本身。

    这里我们需要定义一个函数来在两个有序数组中找到第K个元素,下面重点来看如何实现找到第K个元素。首先,为了避免产生新的数组从而增加时间复杂度,我们使用两个变量i和j分别来标记数组nums1和nums2的起始位置。然后来处理一些边界问题,比如当某一个数组的起始位置大于等于其数组长度时,说明其所有数字均已经被淘汰了,相当于一个空数组了,那么实际上就变成了在另一个数组中找数字,直接就可以找出来了。还有就是如果K=1的话,那么我们只要比较nums1和nums2的起始位置i和j上的数字就可以了。难点就在于一般的情况怎么处理?因为我们需要在两个有序数组中找到第K个元素,为了加快搜索的速度,我们要使用二分法,对K二分,意思是我们需要分别在nums1和nums2中查找第K/2个元素,注意这里由于两个数组的长度不定,所以有可能某个数组没有第K/2个数字,所以我们需要先检查一下,数组中到底存不存在第K/2个数字,如果存在就取出来,否则就赋值上一个整型最大值。如果某个数组没有第K/2个数字,那么我们就淘汰另一个数字的前K/2个数字即可。有没有可能两个数组都不存在第K/2个数字呢,这道题里是不可能的,因为我们的K不是任意给的,而是给的m+n的中间值,所以必定至少会有一个数组是存在第K/2个数字的。最后就是二分法的核心啦,比较这两个数组的第K/2小的数字midVal1和midVal2的大小,如果第一个数组的第K/2个数字小的话,那么说明我们要找的数字肯定不在nums1中的前K/2个数字,所以我们可以将其淘汰,将nums1的起始位置向后移动K/2个,并且此时的K也自减去K/2,调用递归。反之,我们淘汰nums2中的前K/2个数字,并将nums2的起始位置向后移动K/2个,并且此时的K也自减去K/2,调用递归即可。

    ——一位大佬留下的(奥里给!!!)

    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int m = nums1.length;
            int n = nums2.length;
            int left = (m + n + 1) / 2;
            int right = (m + n + 2) / 2;
            return (findKth(nums1, 0, nums2, 0, left) + findKth(nums1, 0, nums2, 0, right)) / 2.0;
        }
        //i: nums1的起始位置 j: nums2的起始位置
        public int findKth(int[] nums1, int i, int[] nums2, int j, int k){
            if( i >= nums1.length) return nums2[j + k - 1];//nums1为空数组
            if( j >= nums2.length) return nums1[i + k - 1];//nums2为空数组
            if(k == 1){
                return Math.min(nums1[i], nums2[j]);
            }
            int midVal1 = (i + k / 2 - 1 < nums1.length) ? nums1[i + k / 2 - 1] : Integer.MAX_VALUE;
            int midVal2 = (j + k / 2 - 1 < nums2.length) ? nums2[j + k / 2 - 1] : Integer.MAX_VALUE;
            if(midVal1 < midVal2){
                return findKth(nums1, i + k / 2, nums2, j , k - k / 2);
            }else{
                return findKth(nums1, i, nums2, j + k / 2 , k - k / 2);
            }        
        }
    }
    
    展开全文
  • 计算两个有序数组中位数

    千次阅读 2018-09-04 11:56:01
    出这两个有序数组中位数。要求算法的时间复杂度为 O(log (m+n))    类比一个数组的中位数,求两个数组的中位数就相当于把两个数组合并后的一个数组的中位数,例 输入: num1=[1,3,5] num2=[2,4,6] ...

    题目:

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

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

     

    类比一个数组的中位数,求两个数组的中位数就相当于把两个数组合并后的一个数组的中位数,例

    输入: num1=[1,3,5]  num2=[2,4,6]

    输出:(3+4)/2=3.5

     

    方法:二分+递归

    思路:

    --看到有序,并且明确要求时间复杂度为log级的,肯定需要二分。但是请注意,很多人一看到二分,就想也不想的开始对数组进行二分,但是对于这题,对数组二分就进了死胡同了。这题是对另一个量进行二分。

    --再分析中位数的特征,就是求数组中的某一个(或两个)数,其左右两边的个数相等

    --设两个有序数组分别为,a,长度m;b,长度n

    --那么这个中位数,就是,a和b合并后的第(m+n+1)/2个(先不管有2个中位数的情况,后面会有个小技巧来屏蔽奇偶差异)

    --那么现在的问题就变成了,求两个有序数组中,从小到大的第k个值

    --所以二分其实是对k进行二分,两个数组同时从0开始,每次往后跳k/2个,当然不是同时跳,谁更小才能跳,保证已经跳过的数在整个数组中是最小的

     

    NO BB,上代码,先写求第k个值的方法

    private int findKth(int[] array1, int start1, int end1, int[] array2, int start2, int end2, int k){
            if(start1>end1){
                return array2[start2+k-1];
            }
            if(start2>end2){
                return array1[start1+k-1];
            }
            if(k==1){
                return Math.min(array1[start1], array2[start2]);
            }
            int mid1=Integer.MAX_VALUE;
            int mid2=Integer.MAX_VALUE;
            //这里的思想,其实不是每次移动整个end-start的一半,而是移动k的一半
            if(start1+k/2-1<=end1){
                mid1=array1[start1+k/2-1];
            }
            if(start2+k/2-1<=end2){
                mid2=array2[start2+k/2-1];
            }
            if(mid1<mid2){
                return findKth(array1, start1+k/2, end1, array2, start2, end2, k-k/2);
            }
            return findKth(array1, start1, end1, array2, start2+k/2, end2, k-k/2);
    }

     

    再写求中位数的方法

    public double findMiddle(int[] array1, int[] array2){
            int totalLength=array1.length+array2.length;
            if(totalLength==0){
                return -1;
            }
            //屏蔽奇偶差异,当是奇数时,k1,k2找到的是同一个中位数;当是偶数时,k1,k2找到的是两个中位数
            int k1=(totalLength+1)/2;
            int k2=(totalLength+2)/2;
            int mid1, mid2;
            if(array1.length==0){
                mid1=array2[k1-1];
                mid2=array2[k2-1];
            }else if(array2.length==0){
                mid1=array1[k1-1];
                mid2=array1[k2-1];
            }else {
                mid1=findKth(array1, 0, array1.length-1, array2, 0, array2.length-1, k1);
                mid2=findKth(array1, 0, array1.length-1, array2, 0, array2.length-1, k2);
            }
            return (double) (mid1+mid2)/2;
        }

     

    展开全文
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3,...

    寻找两个有序数组的中位数

    要求

    给定两个大小为 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

    思路

    1.将两个数组合并
    2.将数组排序
    **3.然后求中间的数,在根据奇偶性,返回不同的值 **

    代码片

    class Solution:
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        nums1.extend(nums2)
        nums1.sort()
        if(len(nums1)%2==0):
           return(nums1[len(nums1)//2-1]+nums1[len(nums1)//2])/2
        else:
            return nums1[(len(nums1)-1)//2]
    
    展开全文
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。 示例: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 解决方法 将两个有序数组放入list,...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为O(log(m+n))。 你可以假设nums1和nums2不会同时为空。 示例1: nums1=[1,3] nums2=[2] 则中位数是2.0 示例2: nums1=[1,2] nums2=[3,4...
  • 寻找两个有序数组中位数

    千次阅读 2019-02-17 13:13:06
    请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例: A = [1, 3] B = [2] 则中位数是 2.0 A = [1, 2] B = [3, 4] 则中位数是 (2 + 3...
  • (JS)寻找两个有序数组中位数

    万次阅读 2020-04-18 13:44:33
    请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 /** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number} ...
  • title: 算法小练——寻找两个有序数组中位数 date: 2019-11-29 19:00:11 categories: ...请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 ...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3,...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。 思想: 找中位数只需把两数组进行排序,找到中位数即可。因为是有序数组,因此,可以对两个...
  • Python寻找两个有序数组中位数

    千次阅读 2018-12-03 20:15:04
    Python寻找两个有序数组中位数 审题: 出意味着这是一个查找算法题 算法复杂度log级别,就是提示你是二分查找 二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: 定理: 有序数组中有一半的...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] ...
  •   请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。   你可以假设 nums1 和 nums2 不会同时为空。 示例 1:   nums1 = [1, 3]   nums2 = [2]   则中位数是 2.0 示例 2: ...
  • 参考:【分步详解】两个有序数组中中位数和Top K问题 题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 ...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为O(log(m + n))。 你可以假设nums1和nums2不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 =...
  • 【Leetcode】两个有序数组中位数

    千次阅读 2016-12-23 00:18:32
    两个有序数组中位数二分查找法详细理解
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2]...
  • LeetCode.4-寻找两个有序数组中位数

    万次阅读 2019-10-24 08:51:27
    请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 =...
  • 4. 寻找两个有序数组中位数

    千次阅读 2019-12-31 18:04:11
    请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = 2 则中位数是 2.0 示例 2: nums1 = ...
  • leetcode中第4题 ‘找两个有序数组中位数’的3种方式 时间复杂度分别是O(m+n) ,O(k),O(log(m+n)) /**1 * O(m+n) * 合并两有序数组成一个新有序数组,再按中间位置取值 * @param nums1 * @param nums2 * @...
  • 请你出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 ...
  • 寻找两个有序数组中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 你可以假设 nums1 和 nums2 不会同时为空。 输入 输出 nums1 = [1, 3] ,nums2 = [2] 2.0 nums1 = [1, 2] ,nums2 = [3, 4]...
  • 中位数中位数就是在一个有序数组中,位于中间的数字,假如数组元素个数为偶数,则取两个中间数字的平均数。 例: 1,2,3,4,5 中位数为:3 1,2,3,4 的中位数为:2.5 算法讲解这个问题其实看起来挺简单的,网上的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,328
精华内容 36,531
关键字:

两个有序数组找中位数