*max_element&&*min_element 数组的最值(看的一个大佬的。。。)

在茫茫代码海中,总有那么一些函数,一些代码,会写的你崩溃。

比如……

全排列?几十行?如果我告诉你,一行就可以搞定呢?

数组最值?for循环?如果我告诉你,一个函数就可以搞定呢?


这就是——黑科技。


这里,将会为你讲述,黑科技的故事。

(不定期看心情更新)




数组最大值,最小值


1、函数

       *max_element(数组+起始下标,数组+结束下标);

      *min_element(数组+起始下标,数组+结束下标);

         (需调用“#include<algorithm>”,“using namespace std”)

         (注意有个星号)

2、作用

直接返回一个数组中最大值或最小值。


3、验证

这俩函数的速度不是一般的快,时间复杂度居然是O(log(n))。

请看这个验证代码,分别比较了*min_element(),枚举,sort排序的速度:

[cpp] view plain copy

    <span style="font-family:'Comic Sans MS';"><span style="font-size:18px;">#include<cstdio>  
    #include<ctime>  
    #include<algorithm>  
    using namespace std;  
      
    double t1,t2;  
    int n,a[399999999],ans=0x7fffffff;  
    //n(max)=399999998  
      
    void input()  
    {  
        printf("Please Input:n=");  
        scanf("%d",&n); printf("\nWhen n is %d\n",n);  
        for(int i=1;i<=n;i++) a[i]=n-i+1;//a[i]=i;  
    }  
      
    void Stepthree()  
    {  
        printf("sort:");  
        t1=clock();  
        sort(a+1,a+1+n);   
        t2=clock();  
        printf("%d\n",a[1]);  
        printf("took:%.3lf\n",(t2-t1)/1000);  
          
        return ;  
    }  
      
    void Steptwo()  
    {  
        printf("search:");  
        t1=clock();  
        for(int i=1;i<=n;i++) ans=min(ans,a[i]);  
        t2=clock();  
        printf("%d\n",ans);  
        printf("took:%.3lf\n\n",(t2-t1)/1000);  
          
        Stepthree();  
    }  
      
    void Stepone()  
    {  
        printf("*min_element:");  
        t1=clock();  
        printf("%d\n",*min_element(a+1,a+1+n));  
        t2=clock();  
        printf("took:%.3lf\n\n",(t2-t1)/1000);  
          
        Steptwo();  
    }  
      
    void Step()  
    {  
        Stepone();  
    }  
      
    int main()  
    {  
        input();  
        Step();  
    }</span></span>  


输入:

n=399999998

输出:

[cpp] view plain copy

    <span style="font-family:'Comic Sans MS';"><span style="font-size:18px;">Please Input:n=399999998  
    When n is 399999998  
      
    *min_element:1  
    took:0.704  
      
    search:1  
    took:1.277  
      
    sort:1  
    took:19.260</span></span>  


可见,这个函数是非常快的,而且十分稳定。

当然,这是对于sort的最不利情况,如果我们在赋值时改成a[i]=i,那么对于sort是最有力的——它不用交换(因为已经从小到大了)。

下面是赋值改后的输出:

[cpp] view plain copy

    <span style="font-family:'Comic Sans MS';"><span style="font-size:18px;">Please Input:n=399999998  
    When n is 399999998  
      
    *min_element:1  
    took:0.967  
      
    search:1  
    took:1.108  
      
    sort:1  
    took:17.396</span></span>


我们可以看到,sort函数快了2s,但是花费的时间还是那么多。

而*min_element依旧很稳定,枚举算法依然很快,但是如果你在循环时要干一些其他事情,可能就慢了。(毕竟sort还帮你排了序,而循环只是查找最值)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值