给定一个数组,找到每个元素的数组中最后一个较小元素的索引。
例如,假设给定的数组是{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)
解决方案更好的解决方案。
任何帮助都将受到高度赞赏。
答案 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)