[LeetCode]414. Third Maximum Number 解题报告(C++)

[LeetCode]414. Third Maximum Number 解题报告(C++)

题目描述

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:

  • 遍历数组找最大.第二大.第三大.
  • 注意坑!!! 初始化要用 LONG_MIN

代码实现:

class Solution0 {
public:
    int thirdMax(vector<int>& nums) {
        long mx1 = LONG_MIN, mx2 = LONG_MIN, mx3 = LONG_MIN;
        for (int x : nums) {
            if (x > mx1) {
                mx3 = mx2;
                mx2 = mx1;
                mx1 = x;
            }
            else if (x<mx1&&x>mx2) {
                mx3 = mx2;
                mx2 = x;
            }
            else if (x > mx3&&x < mx2) {
                mx3 = x;
            }
        }
        return(mx3 == LONG_MIN || mx3 ==mx2 ? mx1 : mx3);
    }
};

方法2:

  • 利用 set 的自动排序和自动去重功能

代码实现:

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

小结

    -

猜你喜欢

转载自blog.csdn.net/qjh5606/article/details/81434453