题解 | #牛牛的最大栈#
牛牛的最大栈
https://www.nowcoder.com/practice/54da2151c9b047b38100ce3f58635a76?tpId=363&tqId=10616727&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D363
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param operations string字符串一维数组
* @param values int整型一维数组
* @return int整型一维数组
*/
public int[] processStackOperations (String[] operations, int[] values) {
// stack1用来存放入栈的元素
Stack<Integer> stack1 = new Stack<>();
// stack2用来存放每个元素入栈时,此时的最大值
Stack<Integer> stack2 = new Stack<>();
// 用来存储最大元素(会在stack2出栈的时候,更新maxNumber为栈顶元素,也就是stack2.peek())
int maxNumber = Integer.MIN_VALUE;
// 用来存储返回值的集合,最后转数组返回
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < operations.length; i++) {
String operation = operations[i];
if (operation.equals("push")) {
// 更新最大值 注意values[i],我原本以为push是按values的顺序,其实这边是按push操作的当前索引,此时values[i]是什么数值,就push什么数值
maxNumber = Math.max(values[i],maxNumber);
// 放入此时最大值
stack2.push(maxNumber);
// 放入节点
stack1.push(values[i]);
} else if (operation.equals("getMax")) {
// 返回此时stack2的栈顶元素就是最大值
Integer number = stack2.peek();
arrayList.add(number);
} else if (operation.equals("pop")) {
// 如果stack1栈顶和stack2栈顶元素相等,此时又是pop操作,可能会把最大值更新
// 为什么是可能?因为如果栈里有两个相同的最大值,那么可能更新后还是相同的
Integer stack1Number = stack1.peek();
Integer stack2Number = stack2.peek();
if (stack1Number.equals(stack2Number)) {
// 相等的话,stack2.pop()
stack2.pop();
// 更新最大值
maxNumber = stack2.peek();
}
stack1.pop();
} else if (operation.equals("top")) {
// 直接返回栈1的栈顶元素即可
arrayList.add(stack1.peek());
}
}
// 集合转数组进行返回
int [] result = new int[arrayList.size()];
for (int i = 0; i < arrayList.size(); i++) {
result[i] = arrayList.get(i);
}
return result;
}
}
本题知识点分析:
1.栈的出栈和入栈
2.集合的存取
3.集合转数组
4.数学模拟
本题解题思路分析:
1.stack1用来存放入栈的元素
2.stack2用来存放每个元素入栈时,此时的最大值
3.其他看注释就可以了,没过测试用例就需要修改细节,主要你想的可能跟它题目测试用例不太一样,稍微改下就行,如果不用额外空间的话,可以考虑维护差值
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话,可以点个赞这支持一下,感谢~


