原题:
解题:
思路一为参考代码,提交并未AC,思路二为AC代码;
思路一:
1)由于复杂度为O(N),因此,只能遍历数组一次,根据以前碰到的求第二大值,所以可以定义三个变量分别存储最大firstMax,二大secMax,三大值thdMax,然后对数组进行遍历
2)如果元素大于最大,那么就将该元素就是新的最大值,在更新最大值之前,原始最大值变为二大,原始二大变为三大,然后再更新最大值
3)如果元素小于最大但是大于二大,同理将二大更新,更新之前,先更新三大,也就是将原始二大赋给三大,代码如下:
注意:该代码并不是AC代码,只是参考:
class Solution { public: int thirdMax(vector<int>& nums) { long firstMax = LONG_MIN; long secMax = LONG_MIN; long thdMax =LONG_MIN; int i = 0; for(;i < nums.size(); i++) { if(nums[i] > firstMax) { thdMax = secMax; secMax = firstMax; firstMax = nums[i]; } else if(nums[i] > secMax && nums[i] < firstMax) { thdMax = secMax; secMax = nums[i]; } else if(nums[i] > thdMax && nums[i] < secMax) { thdMax = nums[i]; } } return (thdMax == LONG_MIN || thdMax == secMax)?firstMax:thdMax; } };
思路二:
1)由于集合set为有序序列,利用这个特点,可以将原始遍历一遍插入set中
2)如果元素个数大于3,则去除set的第一个元素s.begin(),因为这个元素最小
2)如果元素个数小于2,说明没有第三大值,则返回最大值,也就是s.rbegin()
以下为AC代码:
class Solution { public: int thirdMax(vector<int>& nums) { set<int> s; for (int num : nums) { s.insert(num); if (s.size() > 3) { s.erase(s.begin()); } } return s.size() == 3 ? *s.begin() : *s.rbegin(); } };