题解 | #最大体重的牛#
最大体重的牛
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; } }