【发布时间】:2021-09-23 12:23:25
【问题描述】:
到目前为止,在这方面花费了数小时,但仍在苦苦挣扎。我可以在 O(n^2) 中轻松做到这一点,但挑战是在 O(nlog(n)) 时间内完成。
未排序的数组
需要找到最小
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。 -
- 少量语法修正 - 修正了示例中的格式