今天的代码需要用到队列的相关操作:
- poll():检索并删除链表头部元素(第一个元素)
- poolFirst():检索并删除第一个元素,若此列表为空,返回null
- pool Last():检索并删除最后元素,若此列表为空,返回null
- peek():检索但不删除第一个元素
- peekFirst():检索但不删除第一个元素,若此列表为空,返回null
- peekLast():检索但不删除最后一个元素,若此列表为空,返回null
剑指 Offer 59 - I. 滑动窗口的最大值 (是个滑动窗口的模板题,背会)
思路:用循环做超时了。。据说是模板题,还是背会吧
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0)
return null;
int[] result = new int[nums.length-k+1];
Deque<Integer> queue = new ArrayDeque<>();
for (int i=0,j=0;i<nums.length;i++){
// 窗口滑动,只保留k个元素
if (!queue.isEmpty() && i-queue.peek()>=k){
queue.poll();
}
while (!queue.isEmpty() && nums[i]>nums[queue.peekLast()]){//保证队首是最大元素
queue.pollLast();
}
queue.offer(i);
if (i>=k-1){
result[j++] = nums[queue.peek()];
}
}
return result;
}
思路:这题主要就是考察基本操作,用一个help辅助队列来存储当前最大值
private Deque<Integer> queue;
private Deque<Integer> help;
public MaxQueue() {
queue = new ArrayDeque<>();
help = new ArrayDeque<>();
}
public int max_value() {
if (queue.isEmpty())
return -1;
return help.peek();
}
public void push_back(int value) {
queue.offer(value);
// 保证队首是最大元素
while (!help.isEmpty() && value>help.peekLast()){
help.pollLast();
}
help.offer(value);
}
public int pop_front() {
if (queue.isEmpty())
return -1;
int val = queue.pop();
if (help.peek() == val){
help.pop();
}
return val;
}