1.分析问题
首先直观考虑的话,可以利用三次遍历解决问题,但是时间复杂度不符合要求。其次考虑用三个中间值first,second,third来进行一次遍历解决问题,具体实施方式是将三个变量都用INT_MIN来初始化,每次对比当前遍历的值与每个变量之间的关系,不管更新进而达到目的。在本文中将介绍第三种方法,利用集合set的方式,因为set有去重的效果,所以针对本问题非常的适用。
int thirdMax(vector<int>& nums)
{
/*nums为输入的数组*/
set<int> s;
for(auto& n : nums)
{
s.emplace(n);//emplace只涉及一次构造,尽量使用
if(s.size() > 3)
{
s.erase(s.begin());//由于set会自动根据int的大小排序,所以s.begi()始终都是s中的最小值
}
}
return s.size() == 3 ? *s.begin() : *s.rbegin();//根据题意如果没有第三大的数,返回做大值
}