【问题标题】:How to find second max element in an array in one iteration?如何在一次迭代中找到数组中的第二个最大元素?
【发布时间】:2014-08-27 04:28:52
【问题描述】:

我需要一次迭代中未排序数组中的第二个最大元素。 例如:数组是 3 9 8 2 0 -4 87 45 3 2 1 0 答案应该是45,在一次迭代中找到最大元素非常简单,但是如何在同一迭代中找到第二个最大值,或者数组的fort迭代后的恒定时间。

【问题讨论】:

  • 完全一样,你只存储2个元素。
  • 顺便说一句,在一般情况下要找到数组中的第 k 个最大元素,您可以维护一个由数组中的 k 个元素组成的最小堆。遍历数组后,堆应包含数组中的 k 个最大元素,如果您开始清空堆,则元素应按升序弹出。复杂度应为 O(n + klogk)。

标签: arrays algorithm max array-algorithms


【解决方案1】:
int sz = arr.size();
assert(sz >= 2);
int maxElem = arr[0];
int secElem = arr[1];
if (maxElem < secElem) swap(maxElem, secElem);

for (int i = 2; i < sz; ++i) {
    if (arr[i] > maxElem) {
        secElem = maxElem;
        maxElem = arr[i];
    } else if (arr[i] == maxElem) {
        secElem = maxElem;
    } else if (arr[i] < maxElem && arr[i] > secElem)) {
        secElem = arr[i];
    }
}

【讨论】:

  • 很好,除了你不需要第二种情况,也不需要第三种情况下的第一次检查。如果arr[i] == maxElem,那么secElem = maxElem 等价于secElem = arr[i],你的第三种情况处理得很好(或者,如果你只是放arr[i] &lt;= maxElem,而不是&lt;。但是你甚至不需要那个,因为else if:第一种情况下!(arr[i] &lt;= maxElem)被淘汰的情况。
【解决方案2】:
for each element:
  if element is bigger than max, max shifts to second-max, element becomes max
  else if element is bigger than second-max, element becomes second-max

【讨论】:

  • @SchmitzIT:伪代码仍然是代码,请不要将其重新格式化为文本。
【解决方案3】:
function MathLib()
{
    this.getSecondMax=function(args)
    {
        var max = 0;
        var secondMax = 0;
        for(var i=0;i<arguments.length;i++)
        {
            if(arguments[i]>max)
            {
                secondMax = max;
                max = arguments[i];
            }
            else
            {
                if(secondMax<arguments[i])
                {
                    secondMax = arguments[i];
                }
            }
        }
        return secondMax;
    }
}

【讨论】:

  • 添加一些讨论而不是代码sn-ps怎么样。
猜你喜欢
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2015-07-26
  • 2019-08-28
  • 2011-04-07
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多