【问题标题】:Given an array, find out the last smaller element for each element给定一个数组,找出每个元素的最后一个较小的元素
【发布时间】:2017-09-12 19:03:47
【问题描述】:

给定一个数组,找到每个元素在数组中的最后一个较小元素的索引。

例如,假设给定的数组是{4,2,1,5,3}。然后每个元素的最后一个较小的元素将如下所示。

4->3
2->1
1->Null
5->3
3->Null

注意第一对 4->3,3 是数组中最后一个小于 4 的元素。

结果/输出数组将具有索引而不是元素本身。结果将是{4,2,-1,4,-1}

我在一次采访中被问到这个问题,但我想不出比琐碎的O(n^2) 解决方案更好的解决方案。

任何帮助将不胜感激。

【问题讨论】:

    标签: arrays algorithm sorting big-o


    【解决方案1】:

    我们需要对所有具有较小值的元素计算max(index)

    让我们按字典顺序对对(元素、索引)进行排序并遍历它们,以跟踪迄今为止看到的最大索引。这正是最右边的较小元素的位置。以下是如何实现它:

    def get_right_smaller(xs):
        res = [-1] * len(xs)
        right_index = -1
        for val, idx in sorted((val, idx) for idx, val in enumerate(xs)):
            res[idx] = right_index if right_index > idx else -1
            right_index = max(right_index, idx)
        return res
    

    即使输入数组包含相同的数字,此解决方案也能正常工作,因为如果两个元素的值相同,则具有较小索引的元素会更早。

    此解决方案的时间复杂度为O(N log N + N) = O(N log N)(它进行排序和一次线性传递)。

    如果数组的所有元素都是O(N),则可以使用计数排序使此解线性化。

    【讨论】:

    • 很好的解决方案!
    【解决方案2】:
    Make a list, add last element index. 
    Walk through array right to left.     
    For every element:
       if list tail value is smaller then current element
           find the most first smaller list element (binary search, list is sorted)
       otherwise 
           add element index to the list tail, output -1
    

    对于{4,2,1,5,3,6,2},示例列表将包含index 6 (value 2); index 2 (value 1)

    【讨论】:

    • 以数组为例 - {4,2,1,5,3,6,2}。当我从右边处理时。添加后 3,6,2 - 3(root) 2(Left) 6(right) 现在添加 3,6,2 后,对于元素 5,我们将查看树(在插入 5 之前)。 2 存在较小的值 - 3 和 2。选择的正确值是 2,但如果我使用 floor 函数,那么它会给我 3。那么我们如何选择较小的值?
    • 看来我理解条件last smaller element 错误。
    • 添加了新方法。
    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 2016-10-09
    • 2019-07-19
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多