您的位置:首页 > 其它

leetCode---寻找两个有序数组的中位数

2019-04-17 18:31 477 查看

题目:

没考虑时间复杂度时的做法:

class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = 0, n = 0;
float result;
int length = nums1.size() + nums2.size();
for (int i=0;i< nums2.size();i++)
{
nums1.push_back(nums2[i]);
}
sort(nums1.begin(),nums1.end());
/*while (++n < nums1.size())  //此块主要是用来除去重复元素,该题目并不需要
{
if (nums1[m] != nums1
)
nums1[++m] = nums1
;
}
nums1.shrink_to_fit();
int num = (int)(m+1) / 2;*/
int num = length  / 2;
if ((nums1.size() % 2 == 0) && (num != 0))
{
result = (nums1[num - 1] + nums1[num])/2.0;
}
else
{
result = nums1[num];
}
return result;
}
};

没考虑时间复杂度的结果:

官方答案c++版:

class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)   {
int m=nums1.size();
int n=nums2.size();
if(m>n)
{
vector<int>temp(nums1);
nums1=nums2;
nums2=temp;
int tmp=m;m=n;n=tmp;
}
int iMin=0,iMax=m,halfLen=(m+n+1)/2;
while(iMin<=iMax)
{
int i=(iMin+iMax)/2;
int j=halfLen-i;
if(i<iMax&&nums2[j-1]>nums1[i])
{
iMin=i+1;
}else if(i > iMin && nums1[i-1] > nums2[j])
{
iMax=i-1;
}else{
int maxLeft=0;
if(i==0){maxLeft=nums2[j-1];}
else if(j==0){maxLeft=nums1[i-1];}
else{maxLeft=max(nums1[i-1],nums2[j-1]);}
if((m+n)%2==1){return maxLeft;}
int minRight=0;
if(i==m){minRight=nums2[j];}
else if(j==n){minRight=nums1[i];}
else{minRight=min(nums2[j],nums1[i]);}
return (maxLeft+minRight)/2.0;
}
}
return 0.0;
}
};

官方结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: