分析:要求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;
}