这是我第一次刷leetcode做的最顺利的一道题了吧,但是还不是一次性提交的,下面是我的代码:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int l1=nums1.size(),l2=nums2.size(),sz=nums1.size()+nums2.size(),i=0,j=0;
int m,n;
vector<int> tmp;
while(i<l1||j<l2)
{
m=i<l1?nums1[i]:numeric_limits<int>::max();
n=j<l2?nums2[j]:numeric_limits<int>::max();
if(m<=n)
{
i++;
tmp.push_back(m);
}
else
{
j++;
tmp.push_back(n);
}
}
if(sz%2)
return double(tmp[sz/2]);
else return (tmp[sz/2-1]+tmp[sz/2])/2.0;
}
我没能一次性AC,主要是以下几个错误:
第一次,没能正确处理I++和j++,虽然这是来自归并排序算法的老套路了,但还是生疏了啊出错了;
第二次,我懒得查表示整数最大值的方法了,就私自把最大值设为10000了,没想到,还有更大数字的测试。。。
第三次,最后一步return没考虑到整数除以整数还是整数呵呵呵呵好气啊
好了,在分析一些优秀的代码
double findMedianSortedArrays(vector<int>&nums1,vector<int>&nums2)
{
int sz1=nums1.size(),sz2=nums2.size(),sz=sz1+sz2,mid1=sz/2,mid2=sz/2-1+sz%2,count=0,i=0,j=0,sum=0;
while(i<sz1||j<sz2)
{
int m=i<sz1?nums1[i]:numeric_limits<int>::max();
int n=j<sz2?nums2[j]:numeric_limits<int>::max();
m<=n?i++:j++;
if(count==mid1)
sum+=m<=n?m:n;
if(count==mid2)
sum+=m<=n?m:n;
count++;
}
return sum/2;
}
其实这个解法有两点值得学习,首先我自己写的保存了合并后的数组,而就本题而言,这是没必要的;其次它在处理mid2=sz/2-1+sz%2这个还是很新颖的;
通过本题我又被迫复习了一下极限的表示法,记得头文件是limits.