精华内容
下载资源
问答
  • 探寻两个有序数组中位数题目的思路探讨与源码 探寻两个有序数组中位数的题目如下图,该题属于数组类的题目,主要考察对于中位数的理解,通过考虑不同两个数组的相对位置情况,最终求出中位数。本人的思路比较懒,...

    探寻两个有序数组中位数题目的思路探讨与源码
    探寻两个有序数组中位数的题目如下图,该题属于数组类的题目,主要考察对于中位数的理解,通过考虑不同两个数组的相对位置情况,最终求出中位数。本人的思路比较懒,直接使用了列表的合并,该题虽然属于hard难度但是解决思路较简单。
    在这里插入图片描述
    本人在看到该题目后,认为需要将两个数组也就是列表进行合并,不能使用set集合因为会去除两个数组的重复元素,所以使用列表进行合并,然后进行判断,最终的列表究竟是奇数个元素还是偶数个元素,分别求中位数返回即可。代码如下所示:

    #喷火龙与水箭龟
    nums1=[1,3]
    nums2=[2]
    N1=len(nums1)
    N2=len(nums2)
    mid=0
    if(N1==0 or N2==0):
    	if(N1==0):
    		midIndex=int(N2/2)
    		if(N2%2==0):
    			mid=float((nums2[midIndex]+nums2[midIndex-1])/2)
    			print(mid)
    		else:
    			mid=float(nums2[midIndex])
    			print(mid)
    	if(N2==0):
    		midIndex=int(N1/2)
    		if(N1%2==0):
    			mid=float((nums1[midIndex]+nums1[midIndex-1])/2)
    			print(mid)
    		else:
    			mid=float(nums1[midIndex])
    			print(mid)
    setList=nums1+nums2
    setList.sort()
    Nf=len(setList)
    midIndex=int(Nf/2)
    if(Nf%2==0):
    	mid=float((setList[midIndex]+setList[midIndex-1])/2)
    	print(mid)
    else:
    	mid=float(setList[midIndex])
    	print(mid)
    

    在上述代码中,setList是合并后的数组,Nf是合并后的数组长度,midIndex是中位数的下标,通过判断偶数个元素或者奇数个元素进行计算,最终得到结果。最终输入是nums1=[1,3] nums2=[2] ,得到结果2.0 ,是正确的。当然个人认为可能最前面的代码可以省略,那段代码是用来判别是否有一个元素可能为空的情况。需要注意的是,本代码是作者的测试代码,如需放到LeetCode上运行,需要进行函数缩进和加上返回值才可以运行。
    最终结果如下:
    在这里插入图片描述
    从结果来说是速度还行,但是应该可以进一步提速,希望朋友们能够多多指教,非常感谢。

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

     这道题其实有点歧义,有人部分人认为是两个数组合并起来之后的中间值,有人认为是两数组合并之后中间哪一位或者那两位。

    这道题是后者,找中间一位或者两位算平均值 当做其均值 。

    比较简单,但是我用list合并两数组出现问题,每次add进去的都是1可能是list我还没搞明白

    后来新建数组合并好很多,当然不想想了 思路知道就好了  贴一下别人代码 自己加的注释

            int nums1length = nums1.length;
            int nums2length = nums2.length;
            int[] newnums= Arrays.copyOf(nums1, nums1length+nums2length);//数组扩容
            System.arraycopy(nums2, 0, newnums, nums1length, nums2length);
    //src - 源数组。
    //srcPos - 源数组中的起始位置。
    //dest - 目标数组。
    //destPos - 目标数据中的起始位置。
    //length - 要复制的数组元素的数量。 
    
            Arrays.sort(newnums);//将数组排序
            if(newnums.length%2==1){//奇数,取中间
                return newnums[newnums.length/2];
            }
            double num1=newnums[newnums.length/2-1];//取模为偶数时表示取中间两位
            double num2=newnums[newnums.length/2];//但是下标是从0开始的所以除2表示中间上一位 再减一表示中间下一位
            return (num1+num2)/2;

    然后又分析了一波第一名的  也有点不是很懂为什么第一名的三个循环时间最少

    		int nums2length = nums2.length;
    		int[] r = new int[nums1.length + nums2length];//声明一个新的数组大小是两数组之和
    
    		int index = 0;
    		int j = 0;
    		for (int num : nums1) {//循环遍历第一个数组,将第一个数组里面的值全部塞到新数组中
    			while (j < nums2length && num > nums2[j]) {
    				r[index] = nums2[j];
    //将第二个数组遍历,看是否比第一个数组当前值小,小就插入然后j++标记当前第二个塞入个数以及当前位置
    				j++;
    				index++;
    			}
    			r[index] = num;
    			index++;
    		}
    //出来之后数组1一定是塞完了,所以数组2这时遍历如果还有就直接塞入就好 因为题目本身给出的就是有序数组
    		for (; j < nums2length; j++) {
    			r[index] = nums2[j];
    			index++;
    		}
    //最后都一样 如果 模2余1表示中间值是1个 就是除2那个下标 余0表示中间值为两个 是除2 以及除2-1两个下标的平均值
    		int mi = r.length / 2;
    		return r.length % 2 == 1 ? r[mi] : (r[mi - 1] + r[mi]) / 2.0;
    	}

    我想的是将数组2和数组1进行标记,每次给list塞入的时候判断两个数谁大,塞入之后对其标记的数自增更新标记,也减少很多循环次数。但是后来塞入list的值莫名其妙都是1了  就放弃了 反正思路一定是对的 。可能对list的原理不是很明白。

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

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

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

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

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

    万次阅读 多人点赞 2020-02-11 18:54:06
    寻找两个有序数组中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: ...
    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] ...
  • Leetcode-寻找两个有序数组中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。 ...
  • 寻找两个有序数组中位数 要求 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(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...
  • 寻找两个有序数组中位数

    千次阅读 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
    寻找两个有序数组中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 /** * @...
  • 4. 寻找两个有序数组中位数【困难难度】 给定两个大小为 m 和 n 的有序数组nums1 和nums2。 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为O(log(m + n))。 你可以假设nums1和nums2不会同时为空...
  • 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为O(log(m + n))。 你可以假设nums1和nums2不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0示例 2: nums1 = [1, 2] nums2 = [3, ...
  • title: 算法小练——寻找两个有序数组中位数 date: 2019-11-29 19:00:11 categories: Algorithms tags: hard 寻找两个有序数组中位数 描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这...
  • Python寻找两个有序数组中位数

    千次阅读 2018-12-03 20:15:04
    Python寻找两个有序数组中位数 审题: 找出意味着这是一个查找算法题 算法复杂度log级别,就是提示你是二分查找 二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: 定理: 有序数组中有一半的...
  • 寻找两个有序数组中位数 题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。 思想...
  • 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 原题链接:寻找两个有序数组中位数 代码 class Solution: def findMedianSortedArrays...
  • 中位数中位数就是在一个有序数组中,位于中间的数字,假如数组元素个数为偶数,则取两个中间数字的平均数。 例: 1,2,3,4,5 中位数为:3 1,2,3,4 的中位数为:2.5 算法讲解这个问题其实看起来挺简单的,网上的...
  • 力扣---寻找两个有序数组中位数,下面看一下题目 题目叙述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1...
  • 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1:nums1 = [1, 3] nums2 = [2], 则中位数是 2.0 示例 2:nums1 = [1, 2] ...
  • Leetcode2:寻找两个有序数组中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空...
  • 题目:给两个有序数组,长度为n和m,在O(log (m+n))时间内找出两个数组中所有数字的中位数。 题解(参考讨论区大佬解法): 递归分治方法,先上代码: #include &lt;stdio.h&gt; double findK(int *...
  • 参考:【分步详解】两个有序数组中中位数和Top K问题 题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 ...
  • 问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个...简单来说,就是比较两个区间的中位数,如果第一个区间的中位数比第二个大,那么就把第一个区间的范围缩小至它的前半段,把第二个区间缩小至它的后半段,然后重复上述过
  •   请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。   你可以假设 nums1 和 nums2 不会同时为空。 示例 1:   nums1 = [1, 3]   nums2 = [2]   则中位数是 2.0 示例 2: ...
  • leetcode寻找两个有序数组中位数 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会...
  • 寻找两个有序数组中位数 题目描述:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空...
  • 请你找出这两个有序数组中位数,并且要求算法的时间复杂度为O(log(m + n))。 你可以假设nums1和nums2不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 =...

空空如也

空空如也

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

两个有序数组的中位数