查找最小的下一个更大的元素
Finding smallest next bigger element
我有一个任务,要求我为所有数组条目找到数组中所有较大元素中最小的一个,并将相应的索引存储在数组中,但我无法完全弄清楚解决方案的最后一部分。
这有点类似于这里解释的问题: 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;
}
相关文章:
- 查找最小的下一个更大的元素
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 如何查看提升集中<cpp_int>的下一个和上一个元素
- 使用堆栈查找每个元素的下一个更大的元素
- 下一个更大的元素
- 递增迭代器以指向另一个迭代器的下一个元素
- 指针指向数组中的下一个元素,但地址是相同的.如何
- 给定一个 std::set::iterator,获取一个指向下一个元素的迭代器
- std::迭代器是否可以检查该迭代器上是否存在下一个元素?(此设计受到家庭作业的限制)
- 用下一个最大的元素替换每个元素?
- 返回指向指针数组的指针获取下一个元素失败
- C++迭代程序访问下一个元素进行比较
- 如何在向量C++中找到下一个元素
- 是否可以修改c++队列中的下一个元素(最旧的元素)
- 如何寻址循环中的下一个迭代器并在同一地址插入元素
- 在下一个循环之前访问基于 for 循环范围的下一个元素
- std::out_of_range basic_string 当从 vector 中的空字符串转到下一个元素时
- 如何在C++中的字符串数组中找到下一个空闲元素,然后将数据附加到它
- 按顺序搜索boost::multi_index,按顺序获取下一个元素
- 将C++函数重写为C#(将指针传递到数组中的下一个元素)