static const int _xxx = [](){
ios::sync_with_stdio(0);
cin.tie(0);
return 0;
}();
class Solution {
public:
int thirdMax(vector<int>& nums) {
/*
//错误解,只与最大值比较了,没有次大值比较,逻辑错误
int first=nums[0],second=nums[0],third=nums[0];
int num=1;
for(int i=1;i<nums.size();i++)
{
if(nums[i]>=first)
{
num++;
third=second;
second=first;
first=nums[i];
}
else
}
if(num>=3)
return third;
else
return first;*/
/*
//正确解1
int first=0,second=-1,third=-1;
int f=nums[0],s,t;
for(int i=1;i<nums.size();i++)
{
if(nums[i]>f)
{
f=nums[i];
first=i;
}
}
for(int i=0;i<nums.size();i++)
{
if(nums[i]<f)
{
if(second==-1)
{
s=nums[i];
second=i;
}
else if(s<nums[i])
{
s=nums[i];
second=i;
}
}
}
for(int i=0;i<nums.size();i++)
{
if(nums[i]<f&&nums[i]<s)
{
if(third==-1)
{
t=nums[i];
third=i;
}
else if(t<nums[i])
{
t=nums[i];
third=i;
}
}
}
if(third==-1)
return f;
else
return t;
*/
//正确解2
int size=nums.size();
int min=nums[0];
//从最小值出发,从最大值出发是比较麻烦的,因为前三个最大值都要遍历
for(auto i:nums) if(i<min)min=i;
int max[]={min,min,min};
for(int i=0;i<size;i++)
{
if(nums[i]!=max[1]&&nums[i]!=max[2]&&nums[i]>max[0]) //前三个最大值不能包含重复值
{
max[0]=nums[i];
if(max[0]>max[1])swap(max[0],max[1]); //在当前最大三个值中排序,下标0对应元素最小
if(max[1]>max[2])swap(max[1],max[2]);
}
}
if(max[0]==max[1])
return max[2];
else
return max[0];
}
};
个人觉得的易错点:
1.最大的三个值不能相同;
2.使用当前最大三个值中最大值去比较当前元素,会漏掉比当前第二大和第三大还大的数,所以使用最小值是安全的,考虑的东西也很少。