C++:在数组中查找第二个最大元素
C++: Finding second max element in array
我是新来的,正在学习C++语言。现在我必须找到数组中第二大的元素,但我的代码有时不能给出正确的输出。我有以下代码来查找第二个最大元素。
for(int i = 0;i<size;i++)
{
if(arr[i] > max)
{
second_max = max;
max = arr[i];
}
}
这个代码有时工作,有时它没有给出第二个最大元素的正确值。请帮帮我,我做错了什么?
假设您正在查找maximum
和second_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;
}
相关文章:
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 打印无序映射的第二个元素,即集合
- c++:交换向量中所有元组的第一个和第二个元素
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- 为什么我在对向量的第二个元素"push_back"中有C3867错误
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- 如何获得相同数量的第一个和第二个元素以及它们在c++中各自的位置
- 使用索引与迭代器将向量迭代到倒数第二个元素
- C++ 比较容器中所有对的第一个和第二个元素
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 如何仅根据第二个元素对map<int,pair<int,int> >进行排序?
- 如何通过STL设置迭代直到第二个元素
- 如何获取列表中的倒数第二个元素
- 如何在C 对向量的第二个元素上执行较低的操作
- 如何迭代双重链接列表的每个第二个元素(戒指)
- C++迭代到倒数第二个元素
- 迭代对向量并访问第一个和第二个元素
- 为什么在地图中打印第二个元素