写在前面

- 不强调算法方面时间、空间的消耗
- 注重简单、易理解的解题思路

题目详情

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.

示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释:
  • 知识点补充
  • ​c.begin() 返回1个迭代器,指向容器第1个元素​
  • ​c.end() 返回1个迭代器,指向容器最后1个元素的下1个位置 !!!!!!​
  • ​c.rbegin() 返回1个逆序迭代器,指向容器最后1个元素​
  • ​c.rend() 返回1个逆序迭代器,指向容器第1个元素前面位置 !!!!!!​

ac代码

  • ​set<int>​​ 有序、去重特性
  • 每当set里元素数量超过3,就删除第1个最小的数。
  • 时效比相对较差
class Solution
{
public:
int thirdMax(vector<int>& nums)
{
set<int> hset;
for(auto n : nums)
{
hset.insert(n);
if(hset.size()>3)
hset.erase(*hset.begin());
}
if(hset.size()<3)
return *hset.rbegin();
return *hset.begin();
}
};
  • 解题思路
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int thirdMax(vector<int>& nums)
{
sort(nums.begin(), nums.end());
if(nums.empty())
return 0;
vector<int>::reverse_iterator iter = nums.rbegin();
set<int> hset;
for(iter; iter!=nums.rend(); iter++)
{
hset.insert(*iter);
if(hset.size()==3)
break;
}
if(hset.size()<3)
return *hset.rbegin();
return *hset.begin();
}

int main()
{
vector<int> nums;
nums.push_back(1);
nums.push_back(2);
nums.push_back(2);
nums.push_back(5);
nums.push_back(3);
nums.push_back(5);

cout << thirdMax(nums) << endl;
return 0;
}
  • 3次遍历
class Solution {
public:
int thirdMax(vector<int>& nums) {
int num1=INT_MIN,num2=INT_MIN,num3=INT_MIN,cnt=0;
for(int i=0;i<nums.size();i++){
num1=max(num1,nums[i]);
}
for(int i=0;i<nums.size();i++){
if(nums[i]!=num1)
num2=max(num2,nums[i]);
}
for(int i=0;i<nums.size();i++){
if(nums[i]!=num1&&nums[i]!=num2){
if(nums[i]>=num3){
num3=nums[i];
cnt++;}
}
}
return (cnt==0)?num1:num3;
}
};
  • 参考文章