C++ 函数,用于查找数组中四个最小最大元素的总和不起作用

c++ function to find the sum of four minimum maximum elements in an array not working

本文关键字:元素 四个 不起作用 用于 函数 查找 数组 C++      更新时间:2023-10-16

我正在解决一个问题,在这个问题中,我必须编写一个函数,该函数找到传递给它的数组中任何四个整数的最大和最小和,然后显示它。

这是我的代码:

void miniMaxSum(vector<int> arr) {
int minsum=0;
int maxsum=0;
int l1,l2,l3,l4;
int s1,s2,s3,s4;
l1=arr[0];
s1=arr[0];
for(int i=1;i<arr.size();++i)
{
if(l1<arr[i])
l1=arr[i];
if(s1>arr[i])
s1=arr[i];
}
l2=arr[0];
s2=arr[0];
for(int i=1;i<arr.size();++i)
{
if(l2<arr[i]&&arr[i]!=l1)
l2=arr[i];
if(s2>arr[i]&&arr[i]!=s1)
s2=arr[i];
}
l3=arr[0];
s3=arr[0];
for(int i=1;i<arr.size();++i)
{
if(l3<arr[i]&&arr[i]!=l2&&arr[i]!=l1)
l3=arr[i];
if(s3>arr[i]&&arr[i]!=s2&&arr[i]!=s1)
s3=arr[i];
}
l4=arr[0];
s4=arr[0];
for(int i=1;i<arr.size();++i)
{
if(l4<arr[i]&&arr[i]!=l2&&arr[i]!=l1&&arr[i]!=l3)
l4=arr[i];
if(s4>arr[i]&&arr[i]!=s3&&arr[i]!=s2&&arr[i]!=s1)
s4=arr[i];
}
minsum=s1+s2+s3+s4;
maxsum=l1+l2+l3+l4;
cout<<minsum<<" "<<maxsum;
}

此代码为 maxsum 提供了正确的输出,但最小值在所有测试用例中都是错误的。 请帮我找到代码中的错误 提前谢谢。

void miniMaxSum(vector<int> arr) {
sort(arr.begin(), arr.end());
int sumMin = 0, sumMax = 0, len = arr.size() - 1;
for(int i = 0; i < 4; i++){
sumMin += arr[i];
sumMax += arr[len - i];
}
cout<<"minimum sum: "<<sumMin<<endl;
cout<<"maximum sum: "<<sumMax<<endl;
}

如果你考虑复杂性,那么正如Daniel提到的,你可以使用O(N log N)来做到这一点,但你可以使用O(N)来做到这一点,其中N是数组的长度。

这是代码段

void minMaxSum(vector<int> arr){
int l1, l2, l3, l4; // large element;
int s1, s2, s3, s4; // smallest element
l1 = l2 = l3 = l4 = INT_MIN;
s1 = s2 = s3 = s4 = INT_MAX;
for(auto i:arr){
if(i>=l1){
l4 = l3;
l3 = l2;
l2 = l1;
l1 = i;}
else if(i>=l2){
l4 = l3;
l3 = l2;
l2 = i;}
else if(i>=l3){
l4 = l3;
l3 = i;}
else if(i>=l4)
l4 = i;
}
for(auto i:arr){
if(i<=s1){
s4 = s3;
s3 = s2;
s2 = s1;
s1 = i;}
else if(i<=s2){
s4 = s3;
s3 = s2;
s2 = i;}
else if(i<=s3){
s4 = s3;
s3 = i;}
else if(i<=s4)
s4 = i;
}
int minsum = s1 + s2 + s3 + s4;
int maxsum = l1 + l2 + l3 + l4;
cout << maxsum << " " << minsum << endl;
}

假设您可以使用标准库:

void miniMaxSum(const std::vector<int> & arr) {
std::array<int, 4> small_numbers;
std::partial_sort_copy(arr.begin(), arr.end(),
small_numbers.begin(), small_numbers.end(),
std::less<int>());
std::array<int, 4> large_numbers;
std::partial_sort_copy(arr.begin(), arr.end(),
large_numbers.begin(), large_numbers.end(),
std::greater<int>());
std::cout << std::accumulate(small_numbers.begin(), small_numbers.end(), 0)
<< " "
<< std::accumulate(large_numbers.begin(), large_numbers.end(), 0)
<< std::endl;
}

显示适用于 https://repl.it/repls/EntireTornBotany

使用 C++ Stl sort(array,array+n( 对数组进行排序,然后从开头或结尾中选择 n 个数字。将在大哦的nlogn完成