给定一个数组,找出每个元素的最后一个较小的元素

时间:2017-04-17 07:02:36

标签: arrays algorithm sorting big-o

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

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

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

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

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

我在接受采访时被问到这个问题,但我无法想象一个比琐碎的O(n^2)解决方案更好的解决方案。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

我们需要在值较小的所有元素上计算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),则可以使用count sort使此解决方案成为线性。

答案 1 :(得分:1)

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)