原题:
解题:
思路一为参考代码,提交并未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();
}
};