给定一个输入数组,对于每个元素,在每个数组中找到下一个更高的元素。例如{40,50,11,32,55,68,75}
输出应该是{50,55,32,55,68,75,-1}
。如果没有更高的元素,则打印-1。
复杂度应小于O(n^2)
。您可以使用数据结构,并且不限制空间复杂度。
给定一个输入数组,对于每个元素,在每个数组中找到下一个更高的元素。例如{40,50,11,32,55,68,75}
输出应该是{50,55,32,55,68,75,-1}
。如果没有更高的元素,则打印-1。
复杂度应小于O(n^2)
。您可以使用数据结构,并且不限制空间复杂度。
您可以使用栈,时间复杂度为O(N)
。
算法:
从左侧开始向右移动。当您从数组中选择一个元素(假设为x)时,请弹出栈,直到栈中的元素(假设为y)具有大于数组元素即x>y的元素。然后将该元素即x推入栈中。
例如:{40,50,11,32,55,68,75}
,这里s
是堆栈。
40,因为s为空,所以将其推入。 s: 40
50,因为s.peek() < 50,所以弹出40(40的较大元素是50),然后推入50。 s: 50
40的下一个更高的元素-50。
11,s.peek() > 11,所以将11压入。 s: 50, 11
32,s.peek() < 32,因此弹出元素,现在它是50,大于32,因此将32推入。 s: 50,32
11的下一个更高的元素为32。
55,s.peek() < 55,因此弹出元素,即32,然后弹出50(50 < 55),然后推入55。 s: 55
。
32的下一个更高的元素-55。
50的下一个更高的元素-55。
68,s.peek() < 68,所以弹出它并推入68。 s: 68
75,s.peek() < 75,所以弹出它并推入75 s:75
。
68的下一个更高的元素-75。
由于数组没有任何元素,因此只需弹出堆栈即可得知所有数组中的元素都没有更大的元素,即为-1。
75的下一个更高的元素- -1。
相同算法的代码:
public static void getNGE(int[] a) {
Stack<Integer> s = new Stack<Integer>();
s.push(a[0]);
for (int i = 1; i < a.length; i++) {
if (s.peek() != null) {
while (true) {
if (s.peek() == null || s.peek() > a[i]) {
break;
}
System.out.println(s.pop() + ":" + a[i]);
}
}
s.push(a[i]);
}
while (s.peek() != null) {
System.out.println(s.pop() + ":" + -1);
}
}
while(true)
和break
,而不是仅使用while(s.peek() != null && s.peek() <= a[i])
? - Bernhard Barkers.isEmpty()
替换s.peek() == null
,这样可以与标准Java API Stack
一起使用。 - Bernhard Barkerwhile (true)
和 break
,而不是 while (s.peek() != null && s.peek() <= a[i])
。只是也许我需要尽快去做这件事。 - Trying这在C#中可能有效:
IEnumerable<int> NextNumber (int[] numbers)
{
var sorted = numbers.OrderBy(n => n).ToList();
int cnt = numbers.Count()-1;
return numbers.Select(sorted.BinarySearch).Select(i => i == cnt ? -1 : sorted[i + 1]);
}
编辑:如果所请求的结果严格要求下一个更高的元素,而不考虑相对顺序,则此解决方案有效。