求两个有序数组的中位数
2015-08-19 19:37
375 查看
1 题目
There are two sorted arrays nums1 and nums2 of size m andn respectively. Find themedian of the two sorted arrays. The overall run time complexity should beO(log (m+n)).
2 分析
若m+n为奇数则中位数(median)排好序后的中间值,若为偶数则中位数只的是中间两个数的平均值。题目中要求时间复杂度为O(log(m+n)),显然可以用分治的思想求解。
3 实现
int findKth(vector<int> &num1, int begin1, int end1, vector<int> &num2, int begin2, int end2, int k); double Solution::findMedianSortedArrays(vector<int> &num1, vector<int> &num2) { int m = num1.size(); int n = num2.size(); if ((m + n) & 0x1) { return findKth(num1, 0, m - 1, num2, 0, n - 1, (m + n) / 2); } else { return (findKth(num1, 0, m - 1, num2, 0, n - 1, (m + n) / 2 - 1) + findKth(num1, 0, m - 1, num2, 0, n - 1, (m + n) / 2)) / 2.0; } } int findKth(vector<int> &num1, int begin1, int end1, vector<int> &num2, int begin2, int end2, int k) { int m = end1 - begin1 + 1; int n = end2 - begin2 + 1; if (m > n) { return findKth(num2, begin2, end2, num1, begin1, end1, k); } if (0 == m) { return num2[begin2 + k]; } if (0 == k) { return min(num1[begin1], num2[begin2]); } int middle1 = min((begin1 + end1) / 2, k + begin1); int middle2 = begin2 + (k - (middle1 - begin1 + 1)); if (middle2 < begin2) { ++middle2; --middle1; } if (num1[middle1] < num2[middle2]) { return findKth(num1, middle1 + 1, end1, num2, begin2, end2, k - (middle1 - begin1 + 1)); } else if (num1[middle1] > num2[middle2]) { return findKth(num1, begin1, end1, num2, middle2 + 1, end2, k - (middle2 - begin2 + 1)); } else { return num1[middle1]; } }
相关文章推荐
- 异常处理,使用实体类
- Java集合总览
- Android_ConnectivityManager连接管理
- Python中的“_"
- 打印日历
- hdu 5402 一道神奇的模拟题
- 题目:最小路径和
- Android 使用外部db数据库文件
- Android动态设置actionBar
- Servlet 容器对URI的处理
- hdu 5398 GCD Tree 2015多校联合训练赛#9 LCT,动态生成树
- Struts(3)工作机制及分析
- 题目:最小子数组
- 2015/8/19/FramLayout/TableLayout/AbsoluteLayout
- 对web标准的理解
- Win10
- c++构造函数初始化列表
- 各种License
- 题目:最大子数组
- 题目:最后一个单词的长度