zoukankan      html  css  js  c++  java
  • 找min和max

    看到的貌似是阿里的笔试题,题意是一组数,要找到min和max,同时要求时间复杂度(比较次数)小于2n(2n的办法都想得到)。

    别人的思路:n个数的数组里看作每两个一组,若n是奇数,最后个单独看。

    然后遍历一次,找出每组数里的tmax和tmin,tmax存到一个数组,tmin存到一个数组,此时比较次数为n/2;

    可知最大数在max数组里,最小数在min数组里,再用普通线性比较分别遍历两个数组 找到max数组里的最大,min数组里的最小即可比较次数为n/2,n/2

    总共为n/2+n/2+n/2=3n/2;再对max和min数组用同样办法和直接求无差别。

    ps:空间上还可以继续优化下,维护两个gmax,gmin,在每次对每组数找tmax和tmin时,tmax直接和gmax比较 tmin和gmin,随时更新

    这样就不用额外的数组了,或者在原数组里交换位置,让tmax总在右边也可..

     1 void fmm(int *arry,int len)
     2 {
     3     int gmax,gmin;
     4     for(int i=0;i<len;i+=2)
     5     {
     6 
     7         int tmax,tmin;
     8         arry[i]>arry[i+1]?tmax=arry[i],tmin=arry[i+1]:tmax=arry[i+1],tmin=arry[i];
     9         if(i==0)
    10             gmax=tmax,gmin=tmin;
    11         else
    12         {
    13             gmax=gmax>tmax?gmax:tmax;
    14             gmin=gmin<tmin?gmin:tmin;
    15         }
    16     }
    17     
    18     if(len%2)
    19     {
    20         gmax=gmax>arry[len-1]?gmax:arry[len-1];
    21         gmin=gmin<arry[len-1]?gmin:arry[len-1];
    22     }
    23     cout<<gmax<<":"<<gmin<<endl;
    24 }
  • 相关阅读:
    jsp第六周作业
    jsp第四次作业
    JSP第二次作业 2021 0310
    软件测试作业 NO.1
    北航软工优秀作业汇总
    Alpha阶段评审结果和意见反馈
    转会候选人名单
    人员转会流程
    关于团队项目阶段目标的说明
    2021年软工-热身阅读作业
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3343294.html
Copyright © 2011-2022 走看看