携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
一、题目描述:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
- 1 <= nums.length <= 10^4
- -2^31 <= nums[i] <= 2^31 - 1
二、思路分析:
问题描述: 定义3个变量分别记录前3大的数,不容易初始化。如果初始化为INT_MIN,那么第3个变量如果最终是INT_MIN,则无法判定有没有取到第3大的数。
解决方案: 1、采用表示更大范围的long定义变量,就是要初始化为比所有数据都小且能比较的数。 2、采用3个int指针记录,用指针是否为nullptr判断是否取到第3个数 3、采用vector记录,利用vector.size()大小判定。
三、AC 代码:
class Solution {
public:
int thirdMax(vector<int>& nums) {
int *max1 = nullptr, *max2 = nullptr, *max3 = nullptr;
for (int i=0; i<nums.size(); ++i){
if (max1 == nullptr || nums[i] > *max1){
max3 = max2;
max2 = max1;
max1 = &nums[i];
}
else if (nums[i] == *max1)
continue;
else if (max2 == nullptr || nums[i]>*max2){
max3 = max2;
max2 = &nums[i];
}
else if (nums[i] == *max2)
continue;
else if (max3 == nullptr || nums[i]>*max3)
max3 = &nums[i];
}
if (max3 == nullptr)
return *max1;
return *max3;
}
};
class Solution {
public:
int thirdMax(vector<int>& nums) {
vector<int> res;
for (int i=0; i<nums.size(); ++i){
if (res.size() < 3 || nums[i]>res[0])
// 插入元素
insertVector(res, nums[i]);
if (res.size() > 3)
// 维持res大小为3
res.erase(res.begin());
}
if (res.size() < 3)
return res[res.size()-1];
return res[0];
}
void insertVector(vector<int>& res, int num){
if (res.size()==0 || num>res[res.size()-1]){
res.push_back(num);
return;
}
for (auto it=res.begin(); it!=res.end(); ++it){
if (num == *it)
return;
if (num < *it){
res.insert(it, num);
return;
}
}
}
};