day11 栈与队列part02

150. 逆波兰表达式求值 

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(int i = 0; i < tokens.length; i++){
            if("+".equals(tokens[i])){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2 + num1);
            }else if("-".equals(tokens[i])){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2 - num1);
            }else if("*".equals(tokens[i])){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2 * num1);
            }else if("/".equals(tokens[i])){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2 / num1);
            }else{
                stack.push(Integer.valueOf(tokens[i]));
            }
        } 
        return stack.pop();
    }
}

239. 滑动窗口最大值 

要使用数据结构  deque,方便操作队首、队尾

数组中的坐标,举例来确定。

import java.util.ArrayDeque;
import java.util.Deque;

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        // 总共有nums.length - k + 1 个 长度为k的窗口
        int[] result = new int[nums.length - k + 1];
        Deque<Integer> deque = new ArrayDeque<>();
        int index = 0;
        for(int i = 0; i < nums.length; i++){
            // peek 小于 k的窗口时,出队列,  例如i = k时,  0的位置就不在k窗口中
            while(!deque.isEmpty() && deque.peek() < i - k + 1){
                deque.poll();
            }
            // 队列中从后开始,小于当前值的, 也出队列。
            while(!deque.isEmpty() && nums[deque.getLast()] < nums[i]){
                deque.pollLast();
            }
            deque.offer(i);
            // i从k-1开始往结果里填数。   
            if(i >= k - 1){
                result[index++] = nums[deque.peek()];
            }
        }
        return result;

    }
}

347.前 K 个高频元素

先统计频率, 再安排进入队列的顺序。

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

class Solution {

    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        Deque<Integer> deque = new ArrayDeque<>();
        Stack<Integer> stack = new Stack<>();
        // 统计出现频率
        for(int num : nums){
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        for(int key : map.keySet()){
            // 队列中小于当前值频率的,   出队列,进栈。  
            while(!deque.isEmpty() && map.get(deque.getLast()) < map.get(key)){
                stack.push(deque.pollLast());
            }
            if(deque.size() < k){
                // 队列小于k, 如队列, 然后把栈中元素进队列。
                deque.offer(key);
                while(deque.size() < k && !stack.isEmpty()){
                    deque.offer(stack.pop());
                }
            }
        }
        int index = 0;
        int[] result = new int[k];
        while(!deque.isEmpty() && index < k){
            result[index++] = deque.pollFirst();
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值