2022.6.16今天你刷题了吗?
题目:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
分析:
改题目任意理解题目,无非就是考虑这些特殊情况
【1,2,3】,返回1
【1,2,2,3】,返回1
【1,2】,返回2
因此对于去除重复元素,我们可以利用set容器,因为set自带排序以及去除重复元素,我们在每次插入到set容器时,判断此时容器大小是否超过3,如果超过,则删除第一个也就是最小元素,继续插入。所以会存在两种情况
1,最后剩下三个元素,那么我们返回第一个那个元素(自动排序)
2.不超过三个元素,那么我们返回最后一个元素
解析:
1.set容器
class Solution {
public:
int thirdMax(vector<int>& nums) {
set<int>set;
for (auto num : nums)
{
set.insert(num);
if (set.size() > 3)
{
set.erase(set.begin());
}
}
//这里不能用end
return set.size()==3? *set.begin() : *set.rbegin();
}
};
2.插入法
思路:利用三个元素维护最大,中间值,最小,每次判断新元素和这三个值的大小。其中关系如下
class Solution {
public:
int thirdMax(vector<int>& nums) {
long a = LONG_MIN, b = LONG_MIN, c = LONG_MIN;
for (auto num : nums)
{
if (num > a)
{
c = b;
b = a;
a = num;
}
else if (a>num && num>b)
{
c = b;
b = num;
}
else if(b>num && num>c)
{
c = num;
}
}
return c = LONG_MIN ? a : c;
}
};