计算数组中每个数左边第一个比其大的值
如果用最简单的暴力法,时间复杂度最坏情况下 O(n^2)
用栈解决,遍历到a[i]
- 当栈中为空,直接压入
- 栈不为空,比较栈顶元素 top 和 a[i]。 若 top < a[i] ,弹出栈顶元素。循环执行,直到遇到第一个 top>a[i] (top即为第一个比其大的元素)或者 栈为空(左边没有比 a[i] 大的元素)
因此栈中元素从底到上按照从大到小的顺序
for (int index = 0; index < length; index++) {
while (!stack.isEmpty() && arr[index] >= stack.peek()) {
stack.pop();
}
if (!stack.isEmpty()) {
leftFirstMax[index] = stack.peek();
}
stack.push(arr[index]);
}
计算数组中每个数右边第一个比其大的值
思路完全一样,只不过遍历的顺序从右到左
// 栈中从栈底到栈顶 顺序,从右往左遍历,计算每个数右边第一个比其大的值
for (int index = length - 1; index >= 0; index--) {
while (!stack.isEmpty() && arr[index] >= stack.peek()) {
stack.pop();
}
if(!stack.isEmpty()){
rightFirstMax[index]= stack.peek();
}
}
计算数组中每个数左边第一个比其小的值
思路与 1 相同,只不过栈中元素从底到上按照从小到大的顺序
网友评论