leetcode 4

来源:互联网 发布:伴奏制作软件 编辑:程序博客网 时间:2024/06/11 18:02

这是我第一次刷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.

原创粉丝点击