算法专题 --- 栈和队列
栈
在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;
}
}

浙公网安备 33010602011771号