给定未排序的数组,对于每个元素,找到比它大的最早的下一个元素的索引
Given unsorted array, for each element, find index of the earliest next element that is larger than it
我有一个具有不同数字的未排序数组。
[4, 2, 1, 3, 5]
我想要所有可能对 (i, j) 的输出,这意味着下一个大于数组 [i] 的最早数字在数组 [j] 中。 *** 特殊情况:如果你注意到样本输入的反转,[5, 3, 1, 2, 4],没有大于 5 的元素。因此,没有对。
对于原始输入,答案将是 [[0, 4], [1, 3], [2, 3], [3, 4]]
O(n^2) 的解决方案将从索引 i 开始,然后循环到结尾并在到达大于数组 [i] 的元素时停止。有没有办法将其降低到 O(n log n) 或 O(n)?
您可以使用堆栈在 O(n) 内得到结果。要么前进,要么后退。但今后将不会对输出进行排序。 Unshift 将一个元素放在前面。这个想法是我们总是可以使用堆栈的顶部并丢弃不再重要的东西,所以我们只将堆栈上的所有东西压入和弹出一次。
function pairs(arr) {
let stack = [], solution = []
for (let i = arr.length - 1; i >= 0; i--) {
while (stack.length > 0 && stack[stack.length - 1][0] < arr[i])
stack.pop() // ^^^^^^^^^^peek^^^^^^^^^
if (stack.length > 0)
solution.unshift([i, stack[stack.length - 1][1]])
stack.push([arr[i], i])
}
return solution
}
console.log(pairs([4, 2, 1, 3, 5]))
我有一个具有不同数字的未排序数组。
[4, 2, 1, 3, 5]
我想要所有可能对 (i, j) 的输出,这意味着下一个大于数组 [i] 的最早数字在数组 [j] 中。 *** 特殊情况:如果你注意到样本输入的反转,[5, 3, 1, 2, 4],没有大于 5 的元素。因此,没有对。
对于原始输入,答案将是 [[0, 4], [1, 3], [2, 3], [3, 4]]
O(n^2) 的解决方案将从索引 i 开始,然后循环到结尾并在到达大于数组 [i] 的元素时停止。有没有办法将其降低到 O(n log n) 或 O(n)?
您可以使用堆栈在 O(n) 内得到结果。要么前进,要么后退。但今后将不会对输出进行排序。 Unshift 将一个元素放在前面。这个想法是我们总是可以使用堆栈的顶部并丢弃不再重要的东西,所以我们只将堆栈上的所有东西压入和弹出一次。
function pairs(arr) {
let stack = [], solution = []
for (let i = arr.length - 1; i >= 0; i--) {
while (stack.length > 0 && stack[stack.length - 1][0] < arr[i])
stack.pop() // ^^^^^^^^^^peek^^^^^^^^^
if (stack.length > 0)
solution.unshift([i, stack[stack.length - 1][1]])
stack.push([arr[i], i])
}
return solution
}
console.log(pairs([4, 2, 1, 3, 5]))