【LeetCode】Median of Two Sorted Arrays
来源:互联网 发布:mac虚拟机能玩游戏吗 编辑:程序博客网 时间:2024/06/09 14:31
- 题目描述:
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
这题目做的非常头疼……O(m+n)的做法是显而易见的,方法也很多,但是题目明确说了要O(log(m+n)),那就十分困难了。
一开始的想法是对两个数组分别求中位数,然后再根据两个中位数的大小进行相应的判别。但是各种分支情况太多了,搞得头都晕了。后来自己边翻边看1337c0d3r的题解以后,确认这样的思考方向是没问题的,但是理得不够清楚。
实际上就算在看了解答以后仍然花了一段时间去理清思路,因为特例情况还是很多,需要一个一个去处理。递归的过程文章里说的很明白,就不再说了,这里说下终止递归的条件。
1、m=0或者n=0时,返回另一个数组的中位数。
2、m=1或者n=1时(A为m=1或者n=1时的A[0]或者B[0],j=n/2):
A)m+n为偶数时:
a)A>=B[j],median=B[j],min(A,B[j+1])
b)A<B[j],median=B[j],max(A,B[j-1])
B)m+n为奇数时:
a)A>=B[j],median=B[j]
b)A<B[j],median=max(B[j-1],A)
3、m=2或者n=2时:
A)m+n为偶数时:
a)A[0]>=B[j],median=B[j],min(B[j+1],A[0])
b)A[1]<=B[j-1],median=B[j-1],max(B[j-2],A[1])
c)else,median=max(B[j-1],A[0]),min(B[j],A[1])
B)m+n为奇数时:
a)A[0]>=B[j],median=min(B[j+1],A[0])
b)A[1]<=B[j],median=max(B[j-1],A[1])
c)else,median=B[j]
最后,不要忘记判定数组是否越界。
代码如下:
class Solution {public:double findMedianSortedArrays(int A[], int m, int B[], int n) {if (m == 0){if (n % 2 == 0)return (B[n / 2] + B[n / 2 - 1]) / 2.0;elsereturn B[n / 2] / 1.0;}if (n == 0){if (m % 2 == 0)return (A[m / 2] + A[m / 2 - 1]) / 2.0;elsereturn A[m / 2] / 1.0;}else if (m == 1)return getMedian1(A[0], B, n);else if (n == 1)return getMedian1(B[0], A, m);else if (m == 2)return getMedian2(A[0], A[1], B, n);else if (n == 2)return getMedian2(B[0], B[1], A, m);int i = m / 2, j = n / 2;int k(0);if (A[i] <= B[j]){if (m % 2 == 0)k = std::min(i - 1, n - j - 1);elsek = std::min(i, n - j - 1);return findMedianSortedArrays(A + k, m - k, B, n - k);}else{if (n % 2 == 0)k = std::min(j - 1, m - i - 1);elsek = std::min(j, m - i - 1);return findMedianSortedArrays(A, m - k, B + k, n - k);}}double getMedian1(int A, int B[], int n){int j = n / 2;double median(0);if ((n + 1) % 2 == 0){if (A >= B[j]){int b = (j + 1 < n) ? B[j + 1] : INT_MAX;median = (B[j] + std::min(A, b)) / 2.0;}else{int b = (j - 1 >= 0) ? B[j - 1] : INT_MIN;median = (B[j] + std::max(A, b)) / 2.0;}}else{if (A >= B[j]){median = B[j] / 1.0;}else{int b = (j - 1 >= 0) ? B[j - 1] : INT_MIN;median = std::max(b, A) / 1.0;}}return median;}double getMedian2(int A0, int A1, int B[], int n){int j = n / 2;double median(0);if ((n + 2) % 2 == 0){if (A0 >= B[j]){int b = (j + 1 < n) ? B[j + 1] : INT_MAX;median = (B[j] + std::min(b, A0)) / 2.0;}else if (A1 <= B[j - 1]){int b = (j - 2 >= 0) ? B[j - 2] : INT_MIN;median = (B[j - 1] + std::max(A1, b)) / 2.0;}else{median = (std::max(B[j - 1], A0) + std::min(B[j], A1)) / 2.0;}}else{if (A0 >= B[j]){int b = (j + 1 < n) ? B[j + 1] : INT_MAX;median = std::min(B[j + 1], A0);}else if (A1 <= B[j]){int b = (j - 1 >= 0) ? B[j - 1] : INT_MIN;median = std::max(b, A1);}elsemedian = B[j];}return median;}};
- LeetCode: Median of Two Sorted Arrays
- LeetCode Median of Two Sorted Arrays
- leetcode 26: Median of Two Sorted Arrays
- Leetcode 4 Median of Two Sorted Arrays
- [Leetcode] Median of Two Sorted Arrays
- LeetCode 4 - Median of Two Sorted Arrays
- [LeetCode]Median of Two Sorted Arrays
- leetcode Median of Two Sorted Arrays
- LeetCode-Median of Two Sorted Arrays
- [LeetCode] Median of Two Sorted Arrays
- [LeetCode] Median of Two Sorted Arrays
- [leetcode] Median of Two Sorted Arrays
- leetcode-004:Median of Two Sorted Arrays
- Leetcode 4 Median of Two Sorted Arrays
- leetcode之 median of two sorted arrays
- 【转载】【leetcode】Median of Two Sorted Arrays
- LeetCode - Median of Two Sorted Arrays
- [LeetCode]Median of Two Sorted Arrays
- android工程运行报错:unabel to stat activity componentinfo{xx.xx.xxActivity}java.lang.NullPointerException
- 职场规划:三招挑战高薪高职
- aspx 常见错误 CS0016: 未能写入输出文件“c:/WINDOWS/Micros
- ARM9指令详解1
- 第十二周项目1-3protected继承下的访问权限和继承方式
- 【LeetCode】Median of Two Sorted Arrays
- Struts2——SSH (Spring+Struts+Hibernate)框架搭建之配置文件序列一
- ubuntu无法识别android手机
- Linux下测试磁盘I/O性能
- 关于mongodb默认连接
- 二维数组的指针 != 指针的指针
- ACM中java的使用
- 【android】Android 破解实例(一)
- hibernate 对象关系映射文件详解