4. 两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1, 3] nums2 = [2] 中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5
您是否在真实的面试环节中遇到过这道题目呢?
我的解答:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int s1;
int s2;
int sHalf;
int sTwoP;
s1 = nums1.size();
s2 = nums2.size();
sHalf = (s1+s2+1)/2-1;
sTwoP = (s1+s2+1)%2;
if((0==s1)&&(0==s2))
{
return 0;
}
if(0==s1)
{
if(0!=sTwoP)
{
return 0.5*(nums2[sHalf]+nums2[sHalf+1]);
}
else
{
return nums2[sHalf];
}
}
if(0==s2)
{
if(0!=sTwoP)
{
return 0.5*(nums1[sHalf]+nums1[sHalf+1]);
}
else
{
return nums1[sHalf];
}
}
vector<int> *pp = &nums1;
vector<int> *pq = &nums2;
vector<int>::iterator p = pp->begin();
vector<int>::iterator q = pq->begin();
int i,j,k;
/*******************************************************************
c++使用 vector指针访问vector元素时,
不能简单的类似于c中数组和指针的方式。
需要使用迭代器:
vector<int> s;
vector<int> *p = &s;
s.push_back(1);
for (vector<int>::iterator it = p->begin(); it != p->end(); it++)
{
cout << *it<<endl; //使用迭代器,正确
}
https://blog.youkuaiyun.com/fao9001/article/details/75006369
*******************************************************************/
for(k=0;k<sHalf;k++)
{
if((p != pp->end())&&(q != pq->end()))
{
if(*p<*q)
{
p++;
}
else
{
q++;
}
}
else if(p != pp->end())
{
p++;
}
else //(q != pq->end())
{
q++;
}
}
if((p != pp->end())&&(q != pq->end()))
{
if(*p<*q)
{
i=*p;p++;
}
else
{
i=*q;q++;
}
}
else if(p != pp->end())
{
i=*p;p++;
}
else //(q != pq->end())
{
i=*q;q++;
}
if(0!=sTwoP)
{
if((p != pp->end())&&(q != pq->end()))
{
if(*p<*q)
{
j=*p;p++;
}
else
{
j=*q;q++;
}
}
else if(p != pp->end())
{
j=*p;p++;
}
else //(q != pq->end())
{
j=*q;q++;
}
return 0.5*(i+j);
}
else
{
return i;
}
}
};
提交记录
2080 / 2080 个通过测试用例 | 状态: 通过 |
执行用时:64 ms |
我的提交执行用时
已经战胜 47.23 % 的 cpp 提交记录