当前位置: 首页 > 知识库问答 >
问题:

和五个最小数[重复]

任飞龙
2023-03-14

给定一个整数数组,什么算法将返回五个最小数字的和?我想通过一次传递来实现这一点,而不依赖于排序算法。

考虑到我们不能只对输入数组进行排序并得到五个最小的数字,我计划在开始时存储前五个数字,然后比较其余的输入并继续存储五个最小的数字。但是,如果没有排序算法,我如何提取第一个最小的五个呢?

共有3个答案

杜彦君
2023-03-14

选择最初的五个数字并不需要在查看数组的其余部分之前选择五个最小的数字:如果选择了,则无需查看数组的其余部分。

让我们通过为您的方法编写签名来简化此过程:

getSmallest(array<int> input, int nSmallest) -> array<int> # length of nSmallest

这种方法有什么作用?

  • 将第一个最小的元素放入输出数组

生成的输出数组将保存所有最小的元素,并且不会对任何内容进行排序。让我们编写一些伪代码,首先检查输出数组:

# returns true if the candidate was swapped in, false otherwise.
# NOTE: outputArray and candidate can be modified by this function!
# If boolean is 'true' then 'candidate' will contain the swapped out element
swapElement(array<int> outputArray, int candidate) -> boolean
  foreach idx->smallNumber in outputArray
    if (candidate < smallNumber) {
      outputArray[idx] = candidate
      candidate = smallNumber
      return true
    }
  return false

既然我们已经处理了这个核心问题,我们如何使用解决方案?

getSmallest(array<int> input, int nSmallest) -> array<int>
  output[nSmallest] = copy(input, nSmallest) # copies the first nSmallest elements into output
  # Iterate through the remainder of the list
  for (idx = nSmallest, length(input), idx++) {
    checkingCandidate = true
    candidate = input[idx]
    while (checkingCandidate){ # This ensures that swapped candidates get checked too, no matter how many
      checkingCandidate = swapElement(output, candidate)
    } # This will quit once we are no longer swapping elements.
  }
  return output

现在您有了完整的解决方案—伪代码。正如您所看到的,核心问题是拥有输出数组,并在找到它时交换较小的元素(防止您需要先对数组排序)。一旦您将问题归结为“x元素是否比y数组中的任何元素都小”,剩下的就是迭代。哦,最后您只需将输出数组中的所有数字相加,这应该很简单。

姜弘化
2023-03-14

遍历数组并将元素放入大小为5的最大堆中。因此,最后最大堆中存在的元素是最小的元素,它们的总和将导致所需的答案。

对于数组中的每个元素(比如x),检查它是否小于max堆中的max元素。如果它很小,则将堆中的max元素替换为x。否则只需转到下一个元素。

最后,堆中只有5个最小的元素。

顾俊茂
2023-03-14

您可以使用选择算法,其中k为5。您可以将列表从头返回为k并对所有数字求和。如果您对中位数进行中位数,则为O(n)。

该算法依赖于某些排序所依赖的相同的分区例程(想想快速排序)。但是,它不会对元素进行排序。

 类似资料:
  • 题目大意: You’re given k arrays, each array has k integers. There are k^k ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums amo

  • NowCoder 解题思路 快速选择 复杂度:O(N) + O(1) 只有当允许修改数组元素时才可以使用 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l..j-1] 小于等于 a[j],且 a[j+1..h] 大于等于 a[j],此时 a[j] 就是数组的第 j 大元素。可以利用这个特性找出数组的第 K 个元素,这种找第 K 个元素的算法称为快速选择算法。 // jav

  • 问题内容: 我有以下JavaScript语法: 这四舍五入为整数。如何返回两位小数的结果? 问题答案: 注-如果3位数精度很重要,请参阅编辑4 toFixed将根据超过2个小数的值为您舍入或舍入。 编辑 -正如其他人所提到的,它将结果转换为字符串。为了避免这种情况: 编辑2- 正如注释中所提到的,此函数在某种程度上会失败,例如在1.005的情况下,它将返回1.00而不是1.01。如果准确性在这个程

  • 本文向大家介绍C ++中带有数字替换的两个数字的最大和最小和,包括了C ++中带有数字替换的两个数字的最大和最小和的使用技巧和注意事项,需要的朋友参考一下 我们给了两个正数num1和num2。目标是在两个数字都替换为数字后找到这两个数字的最小和最大和。我们被允许在两个数字中替换每个数字中的数字。假设num1为434,num2为324,我们可以将数字3替换为4,将数字4替换为3。那么最小和为-333

  • 寻找替代算法 因此,需要更有效的替代算法。提前致谢

  • 我正在创建一个货币转换应用程序。我想在小数点后得到答案。 这是我的代码:- 谢谢!