【问题标题】:Finding smallest next bigger element寻找最小的下一个更大的元素
【发布时间】:2018-10-06 09:06:25
【问题描述】:

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

这有点类似于这里解释的问题: 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 树可能无济于事,因为我必须在遍历树时检查索引是否更大并且数组条目更大...

【问题讨论】:

  • 你必须使用树而不是数组吗?请提供您想要的示例输入和输出。你使用什么编程语言?
  • 样本输入:[80; 19; 49; 45; 65; 71; 76; 28; 68; 66]样本输出:[-1; 7; 4; 4; 9; 6; -1; 9; -1; -1] -1 用于左侧没有更大元素的条目。编程语言将是 C++,因为有用于抽象数据类型的库,如堆栈或 AVL 树。我也可以使用数组。例如,对数组进行排序(这基本上是由 avl 树或任何其他类型的自平衡二叉搜索树完成的)并出于相同目的使用二叉搜索。
  • 当然是右边

标签: c++ algorithm indexing data-structures tree


【解决方案1】:

最简单的解决方案是从右到左迭代输入,并为每个元素查找树中的第一个更大的元素(或任何具有 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;
}

【讨论】:

  • 太棒了。因此,您可以使用像地图这样的哈希表结构来按所需顺序存储索引。我的解决方案将包括通过对排序数组中的每个元素应用二进制搜索然后对该数组执行 NGE 算法来构建具有原始索引的数组,但这更加优雅。非常感谢!
  • @Rob 您可以使用简单的 BST 来做同样的事情,其中​​每个节点都保存元素的值和索引,您甚至可以将查找和插入合并到一个操作中。但是如果标准库中有什么东西可以工作,你不妨使用它:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2014-07-21
  • 2015-09-14
相关资源
最近更新 更多