【问题标题】:How to implement an efficient algorithm for finding the maximum three in C#? [duplicate]如何在 C# 中实现一个有效的算法来找到最大三个? [复制]
【发布时间】:2020-10-18 11:48:42
【问题描述】:

任务是找出数组中最大的三个(三个数字相乘,使它们的乘积最大)。

数组长度最大1.000.000

-1.000.000 到 1.000.000 的数字范围

问题:我明白了,首先你需要通过快速排序对数组进行排序,然后我应该在什么条件下选择数字?

例如在序列中:

-17, -12, 1, 3, 4 

(-17) * (- 12) * 4 会起作用,即三个最重要的正数相乘会少。

【问题讨论】:

  • 顺便说一句,您实际上并不需要对整个数组进行排序来找到三个最大/两个最小的元素。为此,您只需要遍历数组并跟踪两个/三个最大值。这是一个 O(N) 操作。
  • 对于较大的列表,可以使用简单的冒泡排序,因为您只需要三次迭代即可将三个最大的数字放在首位。你不关心其他的。比较绝对
  • 默认语言环境,谢谢!

标签: c# algorithm quicksort


【解决方案1】:

嗯,对于给定的序列,比如说,

 4, 3, 1, -12, -17 

最大值是 top 3 项的乘积:

4 * 3 * 1 == 12

或 2 个 bottom 项和 top 一项的乘积:

-17 * -12 * 4 == 816

这里,第二个选项提供了更好的结果,所以答案是816。要获得这些前 3 项和后 2 项,您不必排序;一个简单的扫描就足够了:

private static long TopThreeMaximum(IEnumerable<int> values) {
  long Max1 = long.MinValue;
  long Max2 = long.MinValue;
  long Max3 = long.MinValue;

  long Min1 = long.MaxValue;
  long Min2 = long.MaxValue;

  foreach (int value in values) {
    if (value >= Max1) {
      Max3 = Max2;
      Max2 = Max1;
      Max1 = value;
    }
    else if (value >= Max2) {
      Max3 = Max2;
      Max2 = value;
    }
    else if (value > Max3)
      Max3 = value;

    if (Min1 >= value) {
      Min2 = Min1;
      Min1 = value;
    }
    else if (Min2 > value)
      Min2 = value;
  }

  return Math.Max(Max1 * Max2 * Max3, Max1 * Min1 * Min2);
}

【讨论】:

  • 在大多数情况下这是一个很好的答案。我们可能还必须考虑一些边缘情况。例如,如果我们只有 2 个正值怎么办?然后我们必须乘以 1 个正数和 2 个负数。
  • @Olivier Jacot-Descombes:如果我们只有 2 正值,我们将有第二种情况:最高值(正值)和两个最大负值:2, 1, -3, -4, -5 =&gt; 2 * -4 * -5 == 40
【解决方案2】:

由于这是一个作业,我不会为你提供代码,但如果你遵循以下思路,那么你应该可以轻松编写代码:

  • 不要快速排序:它的复杂度为 *nlogn,你可以做 n 的复杂度
  • 找出三个最大的正数
  • 找出三个最小的负数(记住-17小于-12)
  • 单独存放
  • 最后计算这些数字的乘积
  • 注意边缘情况,例如 (-20, -10, -4), (20, 0),不要在任何产品中使用 0,除非您无法获得肯定的结果

编码愉快!

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2014-01-11
    • 1970-01-01
    • 2011-01-15
    • 2015-10-13
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多