f = min(min(a,b),min(c,d));
l = max(max(a,b),max(c,d));
ma = ?
mb = ?
所以,第一个和最后一个是显而易见的,但我怎么知道中间有哪些数字?
找到四个数字中第二高的一种非常懒惰的方法是计算所有可能的三元组的最大值,然后计算这些结果的最小值
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
一个相同的推理适用于第二个最低数的
您可以将它们分成3组,对组执行min/max操作,然后对结果执行相反的操作。我已经在代码中显示了零件结果。
#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-logn(次比较。因此,我会使用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";
}
}