Every day a leetcode
题目来源:414. 第三大的数
解法1:STL set
set 是一个集合类型的容器,里面的元素具有唯一性,并且所有元素都会根据元素的键值自动被排序,以红黑树为底层数据结构。
我们遍历数组nums,将数组的值插入集合,集合中的数递增且唯一,便于我们找到第三大的数。
代码:
/*
* @lc app=leetcode.cn id=414 lang=cpp
*
* [414] 第三大的数
*/
// @lc code=start
class Solution
{
public:
int thirdMax(vector<int> &nums)
{
set<int> s;
for (int i = 0; i < nums.size(); i++)
s.insert(nums[i]);
set<int>::iterator it = s.end();
if (s.size() < 3)
it--;
else
{
it--;
it--;
it--;
}
return *it;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中n是数组nums的长度。
空间复杂度:O(1)
解法2:排序
将数组从大到小排序后,从头开始遍历数组,通过判断相邻元素是否不同,来统计不同元素的个数。如果能找到三个不同的元素,就返回第三大的元素,否则返回最大的元素。
代码:
class Solution {
public:
int thirdMax(vector<int> &nums) {
sort(nums.begin(), nums.end(), greater<>());
for (int i = 1, diff = 1; i < nums.size(); ++i) {
if (nums[i] != nums[i - 1] && ++diff == 3) { // 此时 nums[i] 就是第三大的数
return nums[i];
}
}
return nums[0];
}
};
复杂度分析:
时间复杂度:O(nlogn),其中n是数组nums的长度。sort的时间复杂度是O(nlogn)。
空间复杂度:O(logn),排序需要的栈空间为O(logn)。