C ++中的第三最大数

假设我们有一个非空的整数数组;我们必须在此数组中找到第三个最大数字。如果没有第三个最大数字,则返回最大一个。挑战在于,我们必须使用线性时间复杂度来解决这个问题。

因此,如果输入类似于[5,3,8,9,1,4,6,2],则输出将为6。

为了解决这个问题,我们将遵循以下步骤-

  • 用NULL初始化a,b,c

  • 对于初始化i:= 0,当i <nums大小时,更新(将i增加1),执行-

    • c:= nums [i]

    • 如果b不为null并且nums [i]> b的值,则-

    • b:= nums [i]

    • c:= b

    • 如果不为null并且nums [i]> a的值,则-

    • a:= nums [i]

    • c:= b,b:= a

    • 如果a为null或nums [i]> = a的值,则-

    • 否则,当b为null或nums [i]> = b的值时,则-

    • 否则,当c为null或nums [i]> = c的值时,则-

    • 返回(如果c为null,则为a的值,否则为c的值)

    例 

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int thirdMax(vector<int>& nums) {
          int *a, *b, *c;
          a = b = c = NULL;
          for (int i = 0; i < nums.size(); ++i) {
             if (!a || nums[i] >= *a) {
                if (a && nums[i] > *a) {
                   c = b;
                   b = a;
                }
                a = &nums[i];
             }
             else if (!b || nums[i] >= *b) {
                if (b && nums[i] > *b) {
                   c = b;
                }
                b = &nums[i];
             }
             else if (!c || nums[i] >= *c) {
                c = &nums[i];
             }
          }
          return !c ? *a : *c;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {5,3,8,9,1,4,6,2};
       cout << (ob.thirdMax(v));
    }

    输入项

    {5,3,8,9,1,4,6,2}

    输出结果

    6