我有两个测试用例,但是只有一个能给我正确的输出。 第二个是给我数组的第一个元素。 请告诉我我要去哪里错了。 谢谢。
#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
答案 0 :(得分:3)
您的初始条件不正确。通过将所有3个最大值初始化为数组的第一个条目开始,您将遇到极端情况,在该情况下,数组的其余部分都不满足更改条件。
例如,如果您的数组以max开头,则不会触发任何条件。发生这种情况是因为您的初始条件实际上对其余逻辑无效。
一种解决方法是将3个值设置为数组中前三个值的排序版本。另一种方法是将它们初始化为numerical_limits<int>::min
(如注释中所建议),这对于小于3的数组仅具有特殊情况。另一种方法是跟踪每个值持有者的初始化状态并在比较。
当然,最好的答案是使用预写的原语。 @Jesper Juhl明智地建议使用std::nth_element
,它将直接解决问题。
如果这是一项家庭作业,则可以尝试使用std::set
之类的东西来存储3个最大值。您只需要与第一个条目进行比较,如果比较大则插入,然后擦除新的第一个条目以保持大小== 3。