leetcode题目 寻找两个排序数组的中位数
来源:互联网 发布:土豆网视频下载 mac 编辑:程序博客网 时间:2024/06/04 18:53
题目: 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)).
思路: 既然题目要求小于线性时间,那么只能使用分治思想进行查找。循环解法的边界条件太复杂,本文采用递归方式解法。
代码:
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%的程序。
0 0
- leetcode题目 寻找两个排序数组的中位数
- 寻找两个排序数组的中位数
- 【leetcode】寻找两个已排序数组的中位数(类似二分)
- leetcode 求两个排序数组的中位数
- 寻找两个数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- [leetcode] Median of Two Sorted Arrays 寻找两个有序数组的中位数
- [LeetCode]4 两个有序数组的中位数
- 【Leetcode】两个有序数组的中位数
- [LeetCode] 求两个有序数组的中位数
- 求两个排序数组的中位数
- android jni 引用第三方 so
- Treat your machine fair
- Python利用遗传算法解决八皇后问题
- state状态模式
- 大端模式和小端模式判断
- leetcode题目 寻找两个排序数组的中位数
- 黑马程序员——foundation框架(一)
- mybatis(1)mybatis入门程序
- hdoj 3338 Kakuro Extension 【行进列出 最大流】
- Python实现文件夹深度优先遍历
- 邪恶者@百度游戏关键词 单页收录
- chapter1. 开始
- HUST 1017 Exact cover (Dancing Links 模板题)
- HDU 5468(Puzzled Elena-mobius+树形dp)