找一个数组中第三大的数

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:

输入: [3, 2, 1]

输出: 1

解释: 第三大的数是 1.

示例 2:

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:

输入: [2, 2, 3, 1]

输出: 1

解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
class Solution {
public:
    int thirdMax(vector<int>& nums) {
        int nSize = nums.size();
        if(0 == nSize)
        {
            return -1;
        }
        else if(1 == nSize)
        {
            return nums[0];
        }
        else if(2 == nSize)
        {
            return nums[0] > nums[1] ? nums[0]: nums[1];
        }
        
        int nMax = -2147483648;
		int nSec = -2147483648;
		int nThird = -2147483648;
        bool bRes = false;
        int count = nSize;

	for (int i = 0; i < nSize; i++)
	{
            if(nums[i] == -2147483648 && !bRes)
            {
                bRes = true;
                continue;
            }
            if(nMax == nums[i] || nSec == nums[i] || nThird == nums[i])
            {
                count--;
            }
            
	    if (nMax<nums[i])
	    {
                nThird = nSec;
                nSec = nMax;
		nMax = nums[i];
	    }
	    else if(nSec <nums[i] && nMax != nums[i])
	    {
                nThird = nSec;
		nSec = nums[i];
	     }
	     else if(nThird < nums[i] && nSec != nums[i] && nMax != nums[i])
	     {
                nThird = nums[i];
	     }
	}
        

	if (count>=3)
	{
	    return nThird;
	}
	return nMax;
    }
};

猜你喜欢

转载自blog.csdn.net/QWERDF10010/article/details/83345207