leetcode题目 寻找两个排序数组的中位数
2015-10-01 22:56
633 查看
题目: There are two sorted arrays nums1 and nums2 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)).
思路: 既然题目要求小于线性时间,那么只能使用分治思想进行查找。循环解法的边界条件太复杂,本文采用递归方式解法。
代码:
上边的解法应该是比较容易理解,但是由于是递归调用,所以还可以改为循环实现进行优化。在leetcode上时间运行效率也只击败了30%的程序。
思路: 既然题目要求小于线性时间,那么只能使用分治思想进行查找。循环解法的边界条件太复杂,本文采用递归方式解法。
代码:
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { if (nums1.size() == 0 && nums2.size() == 0) //若两个都为空则返回0 return 0; vector<int> *IsNULL = &nums1, *NotNULL = &nums2; if (nums1.size() == 0 || nums2.size() == 0) //若一个为空返回另一个数组的中位数 { if (nums1.size()) { IsNULL = &nums2; NotNULL = &nums1; //指向非空数组 } if (NotNULL->size() % 2) //若个数为奇数返回中位数 return (*NotNULL)[NotNULL->size() / 2]; else //若个数为偶数返回中间两个数和的平均数 return static_cast<double> ((*NotNULL)[NotNULL->size() / 2] + (*NotNULL)[NotNULL->size() / 2 - 1]) / 2; } if ((nums1.size()+nums2.size())%2) //两个数组都非空且大小为奇数 return FindKthElement(nums1.begin(), --nums1.end(), nums2.begin(), --nums2.end(), (nums1.size() + nums2.size()) / 2+1); else //两个数组都非空且大小为偶数,调用两次查找函数,求平均值 return static_cast<double> (FindKthElement(nums1.begin(), --nums1.end(), nums2.begin(), --nums2.end(), (nums1.size() + nums2.size()) / 2) + FindKthElement(nums1.begin(), --nums1.end(), nums2.begin(), --nums2.end(), (nums1.size() + nums2.size()) / 2+1))/2; } //寻找两个排序数组中第K个数字 double FindKthElement(vector<int>::iterator begin1, vector<int>::iterator end1, vector<int>::iterator begin2, vector<int>::iterator end2, int k) { if (begin1 > end1) //如果中位数都不在第一个数组中 return *(begin2 + k - 1); if (begin2 > end2) //如果中位数都不在第二个数组中 return *(begin1 + k - 1); auto mid1 = begin1 + (end1 - begin1) / 2; auto mid2 = begin2 + (end2 - begin2) / 2; int halflen = mid1 - begin1 + mid2 - begin2 + 2; //四种情况分别对待 if (*mid1 < *mid2) { if (halflen>k) return FindKthElement(begin1, end1,begin2, mid2-1, k); else return FindKthElement(mid1+1, end1, begin2, end2, k-(mid1-begin1)-1); } else { if (halflen>k) return FindKthElement(begin1, mid1-1,begin2 ,end2, k); else return FindKthElement(begin1, end1, mid2+1, end2, k - (mid2 - begin2) - 1); } } };
上边的解法应该是比较容易理解,但是由于是递归调用,所以还可以改为循环实现进行优化。在leetcode上时间运行效率也只击败了30%的程序。
相关文章推荐
- URAL 1057 Amount of Degrees (数位DP,入门)
- Python利用遗传算法解决八皇后问题
- 文字跑出DIV区域显示问题
- 大端模式和小端模式判断
- HDU 5468 Puzzled Elena (2015年上海赛区网络赛A题)
- android jni 引用第三方 so
- 阿里云centOS配置lamp环境
- 眼界
- 最短路总结
- CSS定位:普通流定位属性和浮动
- glibc | strcpy
- appledoc使用说明
- glibc | strlen
- Chrome插件:网页截图
- 安卓assets目录下sharesdk.xml修改无效的问题
- hiho 1227 找到一个恰好包含n个点的圆 (2015北京网赛 A题)
- 小米模式遭竞争者抄袭 山寨者饱受被山寨之苦
- 在Ubuntu上配置Caffe并行计算环境
- Linux初学——磁盘的分区、格式化、检验与载入
- Android Studio