我被给予了一个n个元素的数组,需要找到每个元素右侧比它自己大的最小元素。
For example :
Array = {8,20,9,6,15,31}
Output Array = {9,31,15,15,31,-1}
有没有可能用 O(n)
的时间复杂度解决这个问题呢?我考虑从右侧遍历数组(从 n-2 开始),并为剩余元素构建一个平衡二叉搜索树,因为在其中搜索一个比当前元素立即大的元素将是 O(logn)。
因此,时间复杂度将为 O(n*(log(n))。
是否有更好的解决方案呢?
a
的位置,这在O(n)中完成。或者我是否误解了您从排序中的简化? - amitv
和reverse(v)
上运行算法后,对于每个元素,您都知道应该出现在其右侧的元素的索引(它可能是其右侧的下一个最小元素或其左侧的下一个最小元素)。因此,从任何起始元素i开始,您可以在每个元素中以O(1)时间构建具有索引> = i的解决方案的一部分。翻转符号并重复将为您提供部分左侧(即具有索引<= i的部分)。 - j_random_hacker