不得不说,这道题思路是有的,如果按普通思路实现代码会很复杂;
首先要循环中要分开实现两个元素和三个元素的情况;所以用内置STL函数来实现,如果不用的话,代码会比较长。
一些使用set或者红黑树的例子,其实本质上也是如此,只是在未满3个时的判断操作和插入操作封装了起来。我第一次写的也是调用了sort函数。
class Solution {
public:
int thirdMax(vector<int>& nums) {
int full=0;
vector<int> result;
for(int i=0;i<nums.size();i++)
{
if(i==0)
result.push_back(nums[0]);
if(full<2)
{
if(nums[i]!=result[0]&&nums[i]!=result[full])
{full++;result.push_back(nums[i]);}
}
else
{
sort(result.begin(),result.end());
if(nums[i]>result[0]&&nums[i]!=result[2]&&nums[i]!=result[1])
result[0]=nums[i];
}
}
if(full==0)
return result[0];
else if(full==1)
return max(result[0],result[1]);
else
{sort(result.begin(),result.end());
return result[0];}
}
};
但是看了题解,不得不说,还是有巧妙的方法,那就是不管是否是三个,设置一个无法达到的最小值,也就是int_min。如果数组中不存在第三大的值,那么最小的变量的值必然是int_min,最后通过判断最小变量是否是int_min,来决定最后返回最大变量还是最小变量
class Solution {
public:
int thirdMax(vector<int>& nums) {
long low=LONG_MIN,medium=LONG_MIN,high=LONG_MIN,full=0;
//实际提交过程中发现,会有超出INT_MIN的情况,所以只能用LONG_MIN
for(int i=0;i<nums.size();i++)
{
//也可以用一个nums[i]==high|medium|low,进行continue整体控制
if(nums[i]>high)
{low=medium,medium=high,high=nums[i];}
else if(nums[i]<high&&nums[i]>medium)
{low=medium,medium=nums[i];}
else if(nums[i]<medium&&nums[i]>low)
low=nums[i];
else
continue;
}
return low==LONG_MIN?high:low;
}
};