leetcode 414.第三大的数
程序员文章站
2022-03-07 19:44:55
...
leetcode 414.第三大的数
题目描述
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.
示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
解题思路
方法一: 题目要求要使用时间复杂度为O(n),可以通过三次遍历的方法,依次查找,可以获得第三大的数。
class Solution {
public:
int thirdMax(vector<int>& nums) {
int num1 = INT_MIN, num2 = INT_MIN, num3 = INT_MIN;
// 最大的数
for(int i=0; i<nums.size(); i++){
if(num1 <= nums[i]){
num1 = nums[i];
}
}
// 第二大的数
for(int i=0; i<nums.size(); i++){
if((num1 != nums[i]) && (num2 <= nums[i])){
num2 = nums[i];
}
}
// 第三大的数,这里需要确定是否存在num3,如果存在,flag变为true
bool flag = false;
for(int i=0; i<nums.size(); i++){
if((num1 != nums[i]) && (num2 != nums[i]) && (num3 <= nums[i])){
num3 = nums[i];
flag = true;
}
}
return flag ? num3 : num1;
}
};
方法二 创建一个数组,有顺序的存放三个数,遍历数组的过程中,不断的取更新数组中的元素;c++ stl中提供了set容器,系统会根据元素的值自动排序。
class Solution {
public:
int thirdMax(vector<int>& nums) {
set<int> numsSet;
// 不断更新set中的值
for(int i=0; i<nums.size(); i++){
numsSet.insert(nums[i]);
if (numsSet.size() > 3){
numsSet.erase(numsSet.begin());
}
}
// set的长度小于3,返回最大值,长度等于3就返回最小值。
if(numsSet.size() < 3){
return *(--numsSet.end());
}
else{
return *numsSet.begin();
}
}
};
简化代码(rbegin是反向迭代器)
class Solution {
public:
int thirdMax(vector<int>& nums) {
set<int> numsSet(nums.begin(), nums.end());
auto it = numsSet.rbegin();
if(numsSet.size() < 3){
return *numsSet.rbegin();
}
else{
return *(++(++numsSet.rbegin()));
}
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
推荐阅读
-
#leetcode刷题之路16-最接近的三数之和
-
#leetcode刷题之路36-有效的数独
-
leetcode1193. 每月交易 I 编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。
-
leetcode 576. 出界的路径数
-
Leetcode 576. 出界的路径数
-
LeetCode 出界的路径数(动态规划)
-
[leetcode]16. 最接近的三数之和
-
leetcode:求两数之和,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
-
LeetCode1.两数之和:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,返回数组下标。假设每种输入只对应一个答案。但数组中同一个元素不能使用两遍
-
LeetCode 探索 初级算法 数组 第十题:有效的数独