如何打印数组中的第三大元素?

How to print third largest element in an array?

我有两个测试用例,但只有一个给出了正确的输出。 第二个是给我数组的第一个元素。 请告诉我哪里出错了。 谢谢

#include <iostream>
using namespace std;

void thirdLargest(int arr[], int arr_size)
{
  int m1 = arr[0], m2 = arr[0], m3 = arr[0], i;

  for(i = 0; i < arr_size; i++)
  {
    if(m1 < arr[i])
    {
      m3 = m2;
      m2 = m1;
      m1 = arr[i];
    }
    else if(m2 < arr[i])
    {
      m3 = m2;
      m2 = arr[i];
    }
    else if(m3 < arr[i])
    {
      m3 = arr[i];
    }
  }

  cout << "The third Largest element is " << m3;
}

int main() {
  int n;
  cin >> n;
  int a[n];

  for(int i = 0; i < n; i++)
  {
    cin >> a[i];
  }

  thirdLargest(a, n);

  return 0;
}

测试用例:

TEST CASE 1 

INPUT
6
1 14 2 16 10 20
OUTPUT
The third Largest element is 14

TEST CASE 2 

INPUT
7
19 -10 20 14 2 16 10
OUTPUT
The third Largest element is 16

您的初始条件不正确。通过将所有 3 个最大值初始化为数组的第一个条目,您将遇到极端情况,其中数组其余部分的 none 将满足更改它们的条件。

例如,如果您的数组以最大值开头,那么 none 的条件将永远触发。发生这种情况是因为您的初始条件实际上对其余逻辑无效。

一种修复方法是将您的 3 个值设置为数组中前三个值的 排序 版本。另一种方法是将它们初始化为 numerical_limits<int>::min(如评论中所建议的),对于小于 3 的数组,这只会有一个极端情况。另一种方法是跟踪每个值持有者的初始化状态并在之前检查比较。

当然,最好的答案是使用预先编写的原语。 @Jesper Juhl 明智地建议 std::nth_element 这将直接解决问题。

如果这是家庭作业,您可以尝试使用 std::set 之类的方法来存储 3 个最大值。您只需与第一个条目进行比较,如果较大则插入,然后擦除新的第一个条目以保持大小 == 3。