【问题标题】:Find the last smaller or equal number for every element in the array?找到数组中每个元素的最后一个较小或相等的数字?
【发布时间】:2018-08-10 07:02:17
【问题描述】:

我得到了一个数组。我需要为数组中的每个元素找到最后一个(最右边)较小或相等的数字。

例如:

2 5 1 6 4 7

2 最后一个小于或等于数字 1,
5 最后一个小于或等于数字 4 而不是 1,等等。

另一个例子:

5 100 8 7 6 5 4 3 2 1

在这里,每个元素都有最后一个较小或相等的数字 1。我知道天真的方法,即 O(n²),但需要更好的方法。

【问题讨论】:

  • 请解释“最后一个最小值”背后的逻辑,你是如何将 1 作为 2 的“最后一个最小值”得出的?
  • @LasseVågsætherKarlsen,对于一个元素,我们检查右侧所有较小的元素,然后选择最后一个较小的元素。
  • 我认为他的意思是,对于每个数字,他需要在剩余的数组中找到一个小于当前的数字,并且最后一个这样的数字是最后一个最小值。
  • 我猜最后一个最小值对于最少的数字不存在,1 没有最后一个最小值
  • @Ishpreet,对于 1,我们可以简单地做 1。

标签: arrays algorithm data-structures


【解决方案1】:

到目前为止,您可以从右到左构建一个最小数的 min 数组。 对于您的示例2 5 1 6 4 7,它将是: 从最右边开始:

7
4 7    (4 < 7)
4 4 7  (6 > 4)
...

因此,您示例的最小数组将是:1 1 1 4 4 7

现在对于每个查询,您从 min 数组中的相同位置开始,然后向右走,直到找到一个更大的数字:

对于 2:

2 5 1 6 4 7
1 1 1 4 4 7
^
------^

第一个大于 2 的元素是 4,所以在 = 1 之前返回数字

5:

2 5 1 6 4 7
1 1 1 4 4 7
  ^
----------^

第一个大于 5 的元素是 7,所以返回正好在 = 4 之前的数字

为了有效地找到输入数组中每个元素的第一个更大的元素,您可以使用 upper_bound 算法(C++ 中的示例http://www.cplusplus.com/reference/algorithm/upper_bound/)来找到第一个更大的元素

Upper_bound 需要 log(N) 时间,因此处理输入数组中每个元素的总时间是 O(NlogN)

最小数组的内存复杂度是线性的

【讨论】:

  • 惊人的解释 l!!
  • @MBo 不确定我是否关注你...根据上述想法,我不会一次计算所有结果,也许你找到了更聪明的东西?
  • @arenard 哦,是的,我的错。二进制搜索或最小数组右侧的upper_bound 是很好的解决方案。所以总时间是O(NlogN)
猜你喜欢
  • 2017-09-12
  • 2012-03-18
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2018-08-25
  • 1970-01-01
相关资源
最近更新 更多