zoukankan      html  css  js  c++  java
  • O(n)时间复杂度查找数组第二大元素

     

    分析:要求O(n)时间复杂度,不能用排序。可以设置两个临时变量分别保存当前最大值以及当前第二大的值,然后遍历数组,不断更新最大值和第二大的数值。

     

    代码:

    bool findSec(vector<int> num, int &secv)
    {
        if (num.size()<2)
        {
            return false;
        }
    
        int maxv=num[0];
        secv=num[1];
        int temp=0;
    
    
        for (int i=1;i<(int)num.size();i++)
        {
            if (num[i]>maxv)
            {
                temp=maxv;
                maxv=num[i];
                if (temp>secv)
                {
                    secv=temp;
                }
            }
            else if(num[i]<maxv&&num[i]>secv)//num[i]<maxv这条判断不可少,否则最大元素重复时返回出错;
            {
                secv=num[i];
            }
    
        }
        return true;
    }

     

    参考此文将代码稍作修改:

    bool findSec(vector<int> num, int &secv)
    {
        if (num.size()<2)
        {
            return false;
        }
    
        int maxv=num[0];
        secv=num[1];
    
        if (secv>maxv)
        {
            swap(secv,maxv);
        }
    
        for (int i=2;i<(int)num.size();i++)
        {
            if (num[i]>maxv)
            {
                secv=maxv;
                maxv=num[i];
            }
            else if (num[i]<maxv&&num[i]>secv)//num[i]<maxv这条判断不可少,否则最大元素重复时返回出错;
            {
                secv=num[i];
            }
        }
     
        return true;
    }

     

  • 相关阅读:
    git
    switch切换
    js object 常用方法总结
    pod install速度慢的终极解决方案
    MacBook Pro 初体验
    LINQ以及LINQ to Object 和LINQ to Entities
    WebService/WCF/WebAPI 之间的区别
    owin
    回车和刷新以及Ctr+F5的区别
    ASP.NET Core 启动流程图
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9879992.html
Copyright © 2011-2022 走看看