题目描述
给一个数组,返回一个大小相同的数组。返回的数组的第i个位置的值应当是,对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素(如果之后没有比自己大的元素,或者已经是最后一个元素,则在返回数组的对应位置放上-1)。
简单的例子:
input: 5, 3, 1, 2, 4
return: -1 3 1 1 -1
解法
单调栈
List<Integer> nextExceed(List<Integer> list) {
List<Integer> res = new ArrayList<>();
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < list.size(); i++) {
// 单调递减的栈,如果下一个元素大于栈顶元素,就将元素出栈
while (!stack.isEmpty() && list.get(i) > stack.peek()) {
res.add(stack.peek(), i - stack.peek());
stack.pop();
}
stack.push(i);
}
return res;
}
``