f = min(min(a,b),min(c,d));
l = max(max(a,b),max(c,d));
ma = ?
mb = ?
那么,第一个和最后一个很明显,但是我怎么知道中间是哪个数字呢?
答案 0 :(得分:4)
一种非常懒惰的方法来找到四个数字的第二高是通过计算所有可能的三元组的最大值,然后是那些结果的最小值
min(max(a,b,c),max(a,b,d),max(a,c,d),max(b,c,d))
对于第二低的位置,您执行相反的操作
max(min(a,b,c),min(a,b,d),min(a,c,d),min(b,c,d))
现在很容易将min(a,b)
和max(a,b)
的组合写下来。
之所以可行,是因为在四个可能的三元组中,三个三元组将包含最大值,而一个三元组则不包含最大值。因此,后一个三元组的最大值将给出第二个最高值,而前三个三元组将产生一个最大值。取这四个值中的最小值将使您成为四元组的第二高值。假设c
是最高值,a
是第二高值
max(a,b,c) = c
max(a,b,d) = a
max(a,c,d) = c
max(b,c,d) = c
min(c,a,c,c) = a
相同的推理适用于第二低的数字
答案 1 :(得分:1)
您可以将它们分成3组,并在组中进行最小值/最大值,然后对结果进行相反的操作。我已经在代码中显示了零件结果将是什么。
#include <iostream>
#include <algorithm>
int main() {
int a=2;
int b=1;
int c=4;
int d=3;
std::cout << std::min({a,b,c,d}) << "\n";
std::cout << std::max({std::min({a,b,c}), std::min({a,b,d}), std::min({a,c,d}), std::min({b,c,d})}) << "\n";
// min-> 1 1 2 1
// max-> 2
std::cout << std::min({std::max({a,b,c}), std::max({a,b,d}), std::max({a,c,d}), std::max({b,c,d})}) << "\n";
// max-> 4 3 4 4
// min-> 3
std::cout << std::max({a,b,c,d}) << "\n";
}
但是使用min / max似乎效率不高,因为相同元素被多次比较,而std :: sort可能使用quicksort进行O(n log n)比较。为此,我将使用sort来按顺序获取值。示例:
#include <iostream>
#include <algorithm>
#include <array>
int main() {
int a=2;
int b=1;
int c=4;
int d=3;
std::array A{a,b,c,d};
std::sort(A.begin(), A.end());
for(auto v : A) {
std::cout << v << "\n";
}
}