C++:在数组中查找第二个最大元素

C++: Finding second max element in array

本文关键字:第二个 元素 查找 数组 C++      更新时间:2023-10-16

我是新来的,正在学习C++语言。现在我必须找到数组中第二大的元素,但我的代码有时不能给出正确的输出。我有以下代码来查找第二个最大元素。

for(int i = 0;i<size;i++)
{
    if(arr[i] > max)
    {
        second_max = max;
        max = arr[i];
    }
}

这个代码有时工作,有时它没有给出第二个最大元素的正确值。请帮帮我,我做错了什么?

假设您正在查找maximumsecond_maximum元素,我注意到当arr[i]大于second_max但小于max时,您将跳过该场景。例如,对于以下场景,您的代码将无法正常工作

max: 15
second_max = 7
arr[i] = 12

将以下条件添加到第一个if条件下的代码中:

else if(arr[i] > second_max)
{
    second_max = arr[i];
}

这里有一个只使用标准算法的解决方案:

#include <iostream>
#include <vector>
#include <cassert>
int second_max(std::vector<int> v)
{
    using namespace std;
    sort(begin(v),
         end(v),
         std::greater<>());
    auto last = unique(begin(v),
                       end(v));
    auto size = last - begin(v);
    return (size == 0)
    ? 0
    : (size == 1)
    ? v[0]
    : v[1];
}

int main()
{
    using namespace std;
    cout << second_max({ 3,5,7,7,2,4,3,2,6 }) << endl;
    return 0;
}

这通常应该用std::nth_element来完成,而不是std::sort。这正是它设计的场景,当你只关心几个元素时,可以避免对整个集合进行排序。

您可以使用这个小程序。我只使用std的标准算法,这是我能想到的最简单的算法。

#include <array>
#include <algorithm>
#include <iostream>
int main()
{
    std::array<int, 10> ar = {1, 5, 15, 2, 3, 5, 6, 8, 9, 14};
    // Sort the array
    std::sort(std::begin(ar), std::end(ar));
    // Print the second max element
    std::cout << ar[ar.size() - 2];
}

if语句的逻辑不完整。这是工作版本:

  for(int i = 0; i<size; i++)
  {
    if(max < arr[i]) {
      second_max = max;
      max = arr[i];
    }
    else if(second_max < arr[i])
      second_max = arr[i];
  }

我的解决方案:

#include <stdio.h>
#include <limits.h>
/**
 * get second max of array
 * @param arr the Array
 * @param len the array length
 * @return return second max if searched otherwise return -1
 */
int getSecondMax(const int *arr, int len) {
    int secondMax = INT_MIN; //-2147483647 - 1
    int max = INT_MIN + 1;
    for (int i = 0; i < len; ++i) {
        if (arr[i] > max) {
            secondMax = max;
            max = arr[i];
        } else if (arr[i] > secondMax && arr[i] != max) {
            secondMax = arr[i];
        }
    }
    return secondMax != INT_MIN + 1 ? secondMax : -1;
}
int main() {
    int arr[] = {0, 3, -1, 4, 5};
    int len = sizeof(arr) / sizeof(arr[0]);
    int secondMax = getSecondMax(arr, len);
    secondMax != -1 ? printf("the second max = %dn", secondMax) : printf("not found second maxn");
    return 0;
}