LeetCode第4题--寻找两个有序数组的中位数
2019-03-25 23:41
295 查看
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2,请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。
示例:nums1 = [1, 3, 5] nums2 = [2,6,7,8,9]
则中位数是 4.0
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int num1Len = nums1.size(); int num2Len = nums2.size(); if(num1Len > num2Len) { return findMedianSortedArrays(nums2, nums1); //保证第一个数组最短,以最短的数组为基准 } int C1,C2,L1,L2,R1,R2,lo = 0,hi = 2 * num1Len; //数组扩充为原来2倍,保证都是偶数组 //C表示第几组割接,L表示割接后的左元素,R表示割接后的右元素 while(lo <= hi) { C1 = (lo+hi)/2; C2 = num1Len + num2Len - C1; L1 = (C1 == 0 ? INT_MIN : nums1[(C1-1)/2]); R1 = (C1 == 2*num1Len ? INT_MAX : nums1[C1/2]); L2 = (C2 == 0 ? INT_MIN : nums2[(C2-1)/2]); R2 = (C2 == 2*num2Len ? INT_MAX : nums2[C2/2]); //成为中位数的条件是L1 < L2 && L2 < L1 if(L1 > R2) { hi = C1-1; //二分搜索,注意是C1-1 } else if(L2 > R1) { lo = C1+1; } else break; } return ((max(L1, L2) + min(R1, R2)) / 2.0); }
注意:这里寻找中位数,所以C1+C2=num1Len+num2Len寻找K位数的话,将C1+C2 = 2*K即可
[原文链接如下] (https://www.geek-share.com/detail/2671209803.html)
相关文章推荐
- 寻找两个有序数组的中位数(LeetCode)
- [leetcode] Median of Two Sorted Arrays 寻找两个有序数组的中位数
- leetcode 寻找两个有序数组的中位数
- LeetCode--4. 寻找两个有序数组的中位数(Median of Two Sorted Arrays)
- LeetCode刷题-寻找两个有序数组的中位数
- leetcode 4. 寻找两个有序数组的中位数(Java版)
- [LeetCode]4. 寻找两个有序数组的中位数/C++
- Leetcode-寻找两个有序数组的中位数
- leetcode之数组类之数组的旋转与分治类-----OJ 189/33/81/153/154 数组旋转 旋转数组搜索 88 有序数组合并 4 两个有序数组寻找第K个元素/中位数 35 寻找插入位置
- 基础算法之寻找两个有序数组的中位数(LeetCode-4)
- LeetCode题解(python)-4. 寻找两个有序数组的中位数
- Leetcode(C++)——4. 寻找两个有序数组的中位数
- 【LeetCode】第四题:寻找两个有序数组的中位数
- LeetCode4.python实现:寻找两个有序数组中的中位数问题☆☆☆
- Median of Two Sorted Arrays 两个有序数组的中位数@LeetCode
- 关于在一个序列中寻找中位数和第K大的数(在两个等长有序数组中寻找中位数)
- 寻找两个有序数组合并之后的中位数
- [LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)
- [LeetCode] 求两个有序数组的中位数
- [转载]寻找两个有序数组中的第K个数或者中位数