【问题标题】:c++ function to find the sum of four minimum maximum elements in an array not workingc ++函数查找数组中四个最小最大元素的总和不起作用
【发布时间】:2020-09-18 05:15:45
【问题描述】:

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

这是我的代码:

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 的正确输出,但所有测试用例中的 minsum 都是错误的。 请帮我找出代码中的错误 提前致谢。

【问题讨论】:

  • 如果在最小值或最大值 4 中有重复的元素,此算法将失败。您是否考虑过对数组进行排序,只查看第一个和最后 4 个?
  • @cigien 对于没有重复的数组,它也失败了。
  • 对于输入 1,2,3,4,5 结果应该是 10 14 但它给出 4 14,为什么@cigien 请告诉
  • 好吧,你为什么不提供一个失败的测试用例,并显示预期输出和实际输出。
  • 因为你将ss初始化为arr[0],这是最小的元素,只有找到更大的元素才更新,这是不可能的。所以你所有的ss 都是 1。

标签: c++ arrays algorithm c++11


【解决方案1】:
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;
}

【讨论】:

    【解决方案2】:

    如果您考虑复杂性,那么正如丹尼尔所说,您可以使用 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;
    }
    
    

    【讨论】:

      【解决方案3】:

      假设你可以使用标准库:

      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 上工作

      【讨论】:

        【解决方案4】:

        使用 C++ Stl sort(array,array+n) 对数组进行排序,然后从开始或结束中选择 n 个数字。将在 nlogn 的 Big oh 中完成

        【讨论】:

          猜你喜欢
          • 2013-12-15
          • 1970-01-01
          • 2021-12-25
          • 1970-01-01
          • 2022-12-31
          • 2020-10-26
          • 1970-01-01
          • 2016-03-18
          • 1970-01-01
          相关资源
          最近更新 更多