算法专题 --- 栈和队列

在java中栈使用ArrayDeque和LinkedList,这两个集合类既实现了List接口,也实现了Deque接口。因此以上集合类可以当栈也可以当双端队列使用。

一个有getMin方法的栈

1、使用两个栈完成getMin功能,分别为data栈和min栈

压入规则:将数据压入data栈,判断min栈是否为空

  • 若为空,min栈也压入此数据
  • 若不为空,若min栈中的栈顶元素大于等于压入的数据,min栈中也压入此数据。否则,什么也不做。

弹出规则:将data栈栈顶元素弹出,

  • 当data栈中弹出栈顶数据,若min栈栈顶数据等于弹出的数据,则min栈也弹出栈顶,否则什么不做。
import java.util.ArrayDeque;

public class MyStack {
    private ArrayDeque<Integer> data;
    private ArrayDeque<Integer> min;
    public MyStack(){
        this.data = new ArrayDeque<>();
        this.min = new ArrayDeque<>();
    }
    public void push(int newNum){
        if(this.data.isEmpty()) this.min.push(newNum);
        else if(newNum <= this.getmin()) this.min.push(newNum);
        this.data.push(newNum);
    }
    public int pop(){
        if(this.data.isEmpty()) throw new RuntimeException("Your stack is empty.");
        int value = this.data.pop();
        if(value == this.getmin()) this.min.pop();
        return value;
    }
    public int getmin(){
        if(this.min.isEmpty()) throw new RuntimeException("Your stack is empty.");
        return this.min.peek();
    }
}

滑动窗口的最大值

import java.util.LinkedList;

public class MaxSlideWindow {
    public int[] getMaxSlideWindow(int[] nums, int k){
        if(nums == null || nums.length == 0 || nums.length < k) return new int[0];
        int n = nums.length, m = 0;
        int[] ans = new int[n - k + 1];
        LinkedList<Integer> qmax = new LinkedList<>();
        for(int i = 0; i < n; i++){
            while (!qmax.isEmpty() && nums[qmax.peekLast()] <= nums[i]) qmax.pollLast();
            qmax.offerLast(i);
            if(qmax.peekFirst() == i - k) qmax.pollFirst();
            if(i >= k - 1) ans[m++] = nums[qmax.peekFirst()];
        }
        return ans;
    }
}
posted @ 2020-09-16 10:45  希望之翼zzz  阅读(57)  评论(0)    收藏  举报