版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86243116
day15, 第三大的数
题目来源:leetcode
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.
示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
解答:很有意思的题目,如果没有时间复杂度的限制,这是一道十分简单的题目。现在由于要求是线性时间,很多方法(排序,set…)都不能使用。
刚开始我想开辟一个数组,结果测试用例中出现了 -2^31的数字,这个方法也不能用。
最终方法,设置三个标记 first, second, third, 分别为第一、第二、第三大的数字。遍历三遍,这样就OK了。
注意一点,由于有 -2^31 这样的测试点,因此 third应该用long类型。
代码:
class Solution {
public:
int thirdMax(vector<int>& nums) {
int first = INT_MIN, second = INT_MIN;
long third = LONG_MIN;
for( int i = 0; i < nums.size(); i++)
if( nums[i] > first)
first = nums[i];
//cout<<first<<endl;
for( int i = 0; i < nums.size(); i++)
if( nums[i] < first && nums[i] > second)
second = nums[i];
//cout<<second<<endl;
for( int i = 0; i < nums.size(); i++)
if( nums[i] < second && nums[i] > third)
third = nums[i];
if( third != LONG_MIN)
return third;
return first;
}
};
运行结果: