题解 | #最大体重的牛#

最大体重的牛

https://www.nowcoder.com/practice/0333d46aec0b4711baebfeb4725cb4de

思路:

用两个栈来记录,第一个栈s用来保存真实的牛的重量,第二个栈 `maxStack` 用来记录当前数据到栈底的最大值,那么`maxStack`的栈顶值就是当前所有数据的最大值。

这样在获取最大值时,直接返回maxStack的栈顶元素,就是`O(1)` 的时间复杂度

画个图:

  1. push时,第一个普通栈直接压栈,第二个栈maxStack需要判断当前元素到栈底的最大值,将最大值压栈。此时maxStack中栈顶元素就是所有牛的最大重量。
  2. pop时,对两个栈都出栈
  3. top时,对第一个栈S返回栈顶元素即可
  4. 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;
    }
}

全部评论

相关推荐

2024-12-10 05:47
天津外国语大学 Java
27🐭🐭许愿offer:27确实少,沟通六百多,只约了7厂,猛猛投,还是有机会的
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务