题解 | #最大体重的牛#
最大体重的牛
https://www.nowcoder.com/practice/0333d46aec0b4711baebfeb4725cb4de
思路:
用两个栈来记录,第一个栈s用来保存真实的牛的重量,第二个栈 `maxStack` 用来记录当前数据到栈底的最大值,那么`maxStack`的栈顶值就是当前所有数据的最大值。
这样在获取最大值时,直接返回maxStack的栈顶元素,就是`O(1)` 的时间复杂度
画个图:
- push时,第一个普通栈直接压栈,第二个栈maxStack需要判断当前元素到栈底的最大值,将最大值压栈。此时maxStack中栈顶元素就是所有牛的最大重量。
- pop时,对两个栈都出栈
- top时,对第一个栈S返回栈顶元素即可
- getMax时,第二个栈maxStack的栈顶元素就是当前普通栈中栈顶元素对应的最大值。
import java.util.*;
public class Solution {
private Stack<Integer> s = null; // 用来记录牛的体重
private Stack<Integer> maxStack = null; // 用来记录自此到栈底的最大值
public int[] max_weight_cow (String[] ops, int[][] vals) {
int n = ops.length;
int[] res = new int[n];
for(int i = 0; i < n;i ++){
String op = ops[i];
if("MaxCowStack".equals(op)){
s = new Stack<>();
maxStack = new Stack<>();
res[i] = -1;
}else if("push".equals(op)){
s.push(vals[i][1]);
if(maxStack.isEmpty()){
maxStack.push(vals[i][1]);
}else{
// 比较当前栈中的最大值
int tmp = maxStack.peek() > vals[i][1] ? maxStack.peek() : vals[i][1];
maxStack.push(tmp);
}
res[i] = -1;
}else if("pop".equals(op)){
s.pop();
maxStack.pop();
res[i] = -1;
}else if("top".equals(op)){
res[i] = s.peek();
}else if("getMax".equals(op)){
res[i] = maxStack.peek();
}
}
return res;
}
}