【每日刷题】第三大的数

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
};

运行结果:image.png-23.1kB


我的微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/86243116