牛客网-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;
}

 

 

 

 

posted @ 2018-10-30 22:16  eeeeeeee鹅  阅读(719)  评论(0编辑  收藏  举报