题目:
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).
Example 1:
Input: [3, 2, 1] Output: 1 Explanation: The third maximum is 1.
Example 2:
Input: [1, 2] Output: 2 Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
Input: [2, 2, 3, 1] Output: 1 Explanation: Note that the third maximum here means the third maximum distinct number. Both numbers with value 2 are both considered as second maximum.
翻译:
给定一个非空的数组,返回这个数组中第三大的数字。如果不存在的话,返回最大的数字。时间复杂度要控制在O(n)。
例子1:
输入: [3, 2, 1] 输出: 1 解释: 第三大的数字是1。
例子2:
输入: [1, 2] 输出: 2 解释: 第三大的数字不存在,所以返回最大的数字(2)代替。
例子3:
输入: [2, 2, 3, 1] 输出: 1 解释: 注意第三大的数字是指第三大不相同的数字。两个数字值都为2被看成同一个第二大的数字。
思路:
Method1:
能想到的最简单的方法就是先用sort进行排序,然后利用一个set集合(有序且去重)来存储数字,扫描到倒数第三个数字就是所需,若不存在,直接返回s.rbegin()即最大的数字。
Method 2:
LeetCode上有人是这样做的,很巧妙,因为重复的数字算作同一个,因此,用一个有序的集合set来存储数字,而且,整个set中最多只存储3个数字,那么如果set的个数为3,那么set.begin()即是第三大的数字;若set中的数字少于3,也就是不存在第三大的数字,那么s.rbegin()(反向迭代器)中就是最大的数字。
C++代码(Visual Studio 2017):
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
class Solution {
public:
int thirdMax(vector<int>& nums) {
//Method 1:
set<int> s;
sort(nums.begin(), nums.end());
for (int num : nums) {
s.insert(num);
}
if (s.size() < 3)
return *s.rbegin();
int count = 0;
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
count++;
if (count == s.size() - 2)
return *it;
}
/*Method 2:
set<int> top3;
for (int num : nums) {
top3.insert(num);
if (top3.size() > 3)
top3.erase(top3.begin());
}
return top3.size() == 3 ? *top3.begin(): *top3.rbegin(); //rbegin() 反向迭代器*/
}
};
int main()
{
Solution s;
vector<int> nums = { 3,2,2,1 };
int result;
result = s.thirdMax(nums);
cout << result;
return 0;
}