3.第三大的数

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();//根据题意如果没有第三大的数,返回做大值
  }



猜你喜欢

转载自blog.csdn.net/feng__shuai/article/details/80957413