【问题标题】:minimum next greater element in O(nlog(n))O(nlog(n)) 中的最小下一个更大元素
【发布时间】:2021-09-23 12:23:25
【问题描述】:

到目前为止,在这方面花费了数小时,但仍在苦苦挣扎。我可以在 O(n^2) 中轻松做到这一点,但挑战是在 O(nlog(n)) 时间内完成。

  1. 未排序的数组

  2. 需要找到最小A[j]的索引,使得未排序数组中每个元素的A[j] > A[i]j > i

所以本质上是数组中大于一个元素并位于其右侧的最小元素。

如果找不到元素,则索引为-1。

结果是我们正在寻找的相应索引值的数组。

例子:

Input: [80; 19; 49; 45; 65; 71; 76; 28; 68; 66]
Output: [-1; 7; 4; 4; 9; 6; -1; 9; -1; -1]

当前尝试扫描输入数组并为每个元素创建一个值索引对,将它们插入新数组并按值排序。然后可能是二进制搜索或自平衡 BST 的一些变体,但实际的解决方案只是没有想到。

这是对下一个大元素问题的轻微变化。

任何帮助将不胜感激。

【问题讨论】:

  • 我建议从右到左,将值添加到具有 O(logN) 插入和查找时间的数据结构中,例如 BST。
  • 从右到左迭代,对于每个元素,在使用upper_bound 搜索集合后,将一对元素及其索引添加到std::set
  • - 少量语法修正 - 修正了示例中的格式

标签: arrays algorithm


【解决方案1】:

我认为这个问题与寻找节点的后继者非常相似。如果您可以想象数组中的所有值都在 BalancedBST 中,例如 AVL 树。 这里唯一的技巧是我们需要从数组中数字右侧的值中找到后继值。所以这里的诀窍是实际从右到左查询。

所以我们从数组的最后一个元素开始,将其放入 BST 中,然后查询该元素的后继元素。对数组中从右到左的每个元素继续执行此操作。

这将导致 O(NlgN) 因为插入以及在 BST 中找到后继是最坏情况下的 logN。

【讨论】:

    【解决方案2】:

    从右到左开始遍历数组并不断在集合中插入元素,并为每个元素找到它在集合中的上限,这将是当前索引的下一个更大元素的最小值。

    算法:

    for i = n to 1
       ans[i] = set.upper_bound(arr[i])
       set.insert(arr[i])
    return ans
    

    时间复杂度:O(nlogn)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2018-01-08
      • 2019-10-23
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多