栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在未排序的数组中,将每个元素替换为右边的第一个较大的元素

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在未排序的数组中,将每个元素替换为右边的第一个较大的元素

主要思想是以相反的顺序(从右到左)处理数组。我们进行一些观察:

  • 如果我们当前正在处理索引 ik > j> i_和
    A[k] ≤ A[j]
    ,则我们将元素 _k
    称为不相关的,因为它永远不会是元素 1,2,…,k的 任何结果 __
  • 因此,索引 i 的相关元素权构成的单调严格增加的子序列
    A[i+1..n-1]

在您的示例中,相关元素的顺序是从右到左:

       []          [8]    [4,8]      [9]    [5,9]  [2,5,9]  [1,5,9]

它看起来像一个堆栈,我们确实可以使用堆栈来维护迭代之间的顺序。

在处理新元素时,我们首先需要找到数组元素的结果。观察结果是结果是堆栈上的最高元素, 未被
新元素使之无效。因此,我们可以从堆栈中弹出所有无关的元素。然后,最重要的是我们的结果。然后,我们可以推送新元素,因为它与我们的定义相关。

stack = []A = [3, 1, 2, 5, 9, 4, 8]result = [-1]*len(A)for i := len(A) - 1 to 0:    # remove all elements made irrelevant by A[i]    while not stack.empty() && stack.top() <= A[i]:        stack.pop()    # now the top of the stack is the result for index i    if not stack.empty():        R[i] = stack.top()    # push the new element on the stack. The stack will still contain all relevant     # elements in increasing order from top to bottom    stack.push(A[i])

迭代的循环不变式为

i
stack
包含索引右边的相关元素的子序列
i
”。易于验证,并暗示该算法的正确性。

每个元素最多被推送和弹出一次,因此我们的总运行时间为 Ο(n)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469329.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号