414. Third Maximum Number

原题:

414. Third Maximum Number

解题:

思路一为参考代码,提交并未AC,思路二为AC代码;

思路一:

1)由于复杂度为O(N),因此,只能遍历数组一次,根据以前碰到的求第二大值,所以可以定义三个变量分别存储最大firstMax,二大secMax,三大值thdMax,然后对数组进行遍历

2)如果元素大于最大,那么就将该元素就是新的最大值,在更新最大值之前,原始最大值变为二大,原始二大变为三大,然后再更新最大值

3)如果元素小于最大但是大于二大,同理将二大更新,更新之前,先更新三大,也就是将原始二大赋给三大,代码如下:

注意:该代码并不是AC代码,只是参考:

class Solution {
public:
	int thirdMax(vector<int>& nums) 
	{
		long firstMax = LONG_MIN;
		long secMax = LONG_MIN;
		long thdMax =LONG_MIN;
		int i = 0;
		for(;i < nums.size(); i++)
		{
			if(nums[i] > firstMax)
			{
				thdMax = secMax;
				secMax = firstMax;
				firstMax = nums[i];
			}
			else if(nums[i] > secMax && nums[i] < firstMax)
			{
				thdMax = secMax;
				secMax = nums[i];
			}
			else if(nums[i] > thdMax && nums[i] < secMax)
			{
				thdMax = nums[i];
			}
		}
		return (thdMax == LONG_MIN || thdMax == secMax)?firstMax:thdMax;
	}
};

 思路二:

1)由于集合set为有序序列,利用这个特点,可以将原始遍历一遍插入set中

2)如果元素个数大于3,则去除set的第一个元素s.begin(),因为这个元素最小

2)如果元素个数小于2,说明没有第三大值,则返回最大值,也就是s.rbegin()

以下为AC代码:

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int> s;
        for (int num : nums) {
            s.insert(num);
            if (s.size() > 3) {
                s.erase(s.begin());
            }
        }
        return s.size() == 3 ? *s.begin() : *s.rbegin();

    }
};

  

原文地址:https://www.cnblogs.com/xqn2017/p/8481023.html