题解 | #最大体重的牛#
最大体重的牛
https://www.nowcoder.com/practice/0333d46aec0b4711baebfeb4725cb4de
考察知识点:栈
解题思路:使用两个栈,一个栈存储数据,一个栈存储当前栈的最大值,入栈时检查新入栈的值是否比最大值栈栈顶元素要大,并且把两者中较大的元素入最大值栈。出栈时两个栈同时出栈,这样就保证了每次从最大值栈获取到的元素都是数据栈中的最大值。时间复杂度O(1),空间复杂度O(N)
吐槽下牛客新的题库,这道题在力扣应该类模板已经有了,直接把每个方法填好就行,这题搞得要自己去遍历操作数组来判断当前的操作,太费劲了,浪费太多时间在题目之外的代码
import java.util.*;
class MaxStack {
Stack<Integer> data;
Stack<Integer> max;
public void init() {
data = new Stack<>();
max = new Stack<>();
}
public void push(int e) {
data.push(e);
int m = e;
if (!max.isEmpty()) {
m = Math.max(max.peek(), e);
}
max.push(m);
}
public void pop() {
data.pop();
max.pop();
}
public int top() {
return data.peek();
}
public int getMax() {
return max.peek();
}
}
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param op string字符串一维数组
* @param vals int整型二维数组
* @return int整型一维数组
*/
public int[] max_weight_cow (String[] op, int[][] vals) {
// write code here
MaxStack ms = new MaxStack();
int[] res = new int[vals.length];
for (int i = 0; i < op.length; i ++) {
String o = op[i];
switch (o) {
case "MaxCowStack":
ms.init();
res[i] = -1;
break;
case "push":
ms.push(vals[i][1]);
res[i] = -1;
break;
case "pop":
ms.pop();
res[i] = -1;
break;
case "top":
res[i] = ms.top();
break;
case "getMax":
res[i] = ms.getMax();
break;
}
}
return res;
}
}