leetcode-414. 第三大的数刷题笔记(c++)
原创
©著作权归作者所有:来自51CTO博客作者nkgines的原创作品,请联系作者获取转载授权,否则将追究法律责任
写在前面
- 不强调算法方面时间、空间的消耗
- 注重简单、易理解的解题思路
题目详情
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是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里元素数量超过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;
}
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;
}
};