【问题标题】:C++, finding 3 max values in array, where difference between these values is one of the parameterC++,在数组中找到 3 个最大值,其中这些值之间的差异是参数之一
【发布时间】:2017-05-21 18:06:45
【问题描述】:

我必须在真实数据数组中找到 3 个最大值。问题是这 3 个值必须在特定的最小值(即参数)上有所不同。 这意味着如果我有一个包含 10 个元素 {1,2,3,4,5,6,7,8,9,10} 的数组,这个数组中的 3 个最大值是 8,9,10 但如果参数例如是“2”,这 3 个最大值必须至少变化大约“2”,所以在我的情况下,真正的最大值将是 10、8、6。 我相信程序的算法应该是这样的:

1) 找到 3 个最大值(循环) 2)验证它们是否至少在参数上有所不同 2a) 如果是,则返回这 3 个值 2b)如果不是,返回循环,再次搜索3个值,但忽略这个不满足条件的值?

我无法想象这个解决方案的真实 C++ 代码。谁能给点建议怎么做?

【问题讨论】:

  • 数组中的值是否排序?
  • std::sort 数组中的数据。然后从最高值开始遍历数组(这将是您的最大值之一),然后跳到由您的“参数”确定的下一个并选择它,然后是下一个。如果您不想对整个数组进行排序,请使用 std::nth_element 将元素放置在特定的 skip 位置

标签: c++ arrays loops max


【解决方案1】:

比排序更简单的是简单地扫描数组 3 次。 第一次,找到最大值。 下一次,找到最大的数

您是否研究过用于评估算法性能的 Big-O 表示法?

比较排序和搜索的时间 (n * lg(2)n + n) 与搜索 3 次的时间 (3*n) 收支平衡的表现发生在非常小的 n 值上。

【讨论】:

  • 如你所说,我扫描了阵列 3 次。我不知道为什么我没有找到这个解决方案。我无法对数组进行排序,因为我在下一个函数中使用了最大值的索引。感谢您的帮助。
【解决方案2】:

一种方法可以是这样的: 1) 对数组进行排序 2) 根据您的问题选择最后一个 k,在这里 3.如何选择一个参数,如最小差异 d,这里 2;

  1. 从数组的最后一个开始迭代,检查两个元素的差值是否大于 d,然后选择最后一个元素。
  2. 继续迭代,直到找到 k 个元素。

【讨论】:

    【解决方案3】:

    坦率地说,这很简单,您可以使用操作符 % 例如,如果您的参数是 2 并且像您的示例中一样命名为 par,您可以在循环中使用下一个语句。如果没有 0.23 类型的结果,% 会分配一个数字来查看。

    使用下一条语句: if(数字 % par == 0)

    将帮助您确定数字是否被该标准除以 0.xx 数字之后没有任何数字。

    在这样做的同时,您还可以使用一个函数并从您拥有最大值的数组中删除/复制。为此,您必须事先使用循环运行来确定哪个是最大的。

    至于返回,你可以制作一个整数数组并将其作为返回发送。

    【讨论】:

      【解决方案4】:

      如果数组已排序,您可以将值与降序排列的最大值进行比较。如果该值不小于最大值减去参数,则检查最大值。

      所以伪代码看起来像

      Bool getHighestThree(int minDifference)
      {
         Int returnArray[3]
         Int valuesFound = 0
         myArray.sort()
         For (int I = myArray.size - 2; i >= 0; --i)
         {
            If (myArray[myArray.size() - 1] - minDifference > myArray[i])
            {
               returnArray[valuesFound++]
            }
            If (valuesFound == 3)
            {
               Return true
            }
         }
         Return false
      }
      

      您可以更改它以构建数组并返回它,然后检查数组的大小是否为 3。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多