查找最小的下一个更大的元素

Finding smallest next bigger element

本文关键字:元素 下一个 查找      更新时间:2023-10-16

我有一个任务,要求我为所有数组条目找到数组中所有较大元素中最小的一个,并将相应的索引存储在数组中,但我无法完全弄清楚解决方案的最后一部分。

这有点类似于这里解释的问题: https://www.geeksforgeeks.org/smallest-greater-elements-in-whole-array/

唯一的区别是只考虑数组条目右侧的值 (j>i(,例如:

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

带有自平衡树的解决方案对我来说很有意义。但是,我仍然需要考虑索引,因为只有数组条目的解决方案权限是有效的。

有没有办法将插入值的索引映射到树条目,或者创建具有相同结构但旧数组条目的索引而不是作为节点的实际值的第二个树?我不确定,因为自平衡树的结构当然取决于插入的值(较大的值右侧子树,较小的值左侧子树(。

编辑:实际上第二个 AVL 树可能无济于事,因为我必须在遍历树时检查索引是否更大并且数组条目更大......

最简单的解决方案是从右到左遍历输入,并为每个元素查找树中的第一个较大的元素(或使用 O(LogN( 查找和插入的任何数据结构(,然后将元素添加到树中。这样,较大的元素始终位于输入中的元素之后。

对于C++版本,您可以使用元素值为键,输入中的元素索引为值的std::map,并使用upper_bound获取下一个更大的值:

#include <iostream>
#include <vector>
#include <map>
void nextValues(std::vector<int> &in, std::vector<int> &out) {
std::map<int, int> tree;
for (int i = in.size() - 1; i >= 0; i--) {
out.insert(out.begin(), tree.upper_bound(in[i])->second - 1);
tree.insert(std::pair<int, int>(in[i], i + 1));
}
}
int main() {
std::vector<int> a = {80,19,49,45,65,71,76,28,68,66};
std::vector<int> b;
nextValues(a, b);
for (int i : b) std::cout << (int) i << ","; // -1,7,4,4,9,6,-1,9,-1,-1
return 0;
}