239. 滑动窗口最大值 - 力扣(LeetCode):
思路:
自己定义构造单调队列,队列中的首部就是每个窗口的最大元素,每次弹出元素的时候,判断要弹出元素是不是队列里面的最大值(就是队列的首部),加入队列,比加入元素小的全部都弹出。
代码:
主要就是用res 记录每个窗口的最大值,在计算第一个窗口的最大值,最后进行循环即可。
,class Mydeque{
//自己定义构造单调队列
Deque<Integer> deque=new LinkedList<>();
//弹出队列,判断要弹出元素是不是队列里面的最大值
void poll(int val){
if(!deque.isEmpty()&&val==deque.peek()){
deque.poll();
}
}
//加入队列,比元素小的全部都弹出
void add(int val){
while(!deque.isEmpty()&&val>deque.getLast()){
deque.removeLast();
}
deque.add(val);
}
//队列的顶部就是最大元素
int peek(){
return deque.peek();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n=nums.length;
int len=n-k+1;
int []res=new int[len];//每个窗口的最大值
int rar=0; //记录下标
Mydeque mydeque=new Mydeque();
//前三个元素加入
for(int i=0;i<k;i++){
mydeque.add(nums[i]);
}
res[rar++]=mydeque.peek();//第一个窗口最大值
for(int i=k;i<n;i++){
//滑动窗口移除最前面的元素
mydeque.poll(nums[i-k]);
//滑动窗口加入最后面的元素
mydeque.add(nums[i]);
//记录对应的最大值
res[rar++]=mydeque.peek();
}
return res;
}
}
作者:﹋少年つ
链接:https://leetcode.cn/problems/sliding-window-maximum/solutions/3800920/jin-ri-da-qia-jia-you-by-2174854139-bs3g/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
76. 最小覆盖子串 - 力扣(LeetCode)
class Solution {
public String minWindow(String s, String t) {
//特殊情况进行判断
if (s==null||s.isEmpty()||t.isEmpty()||t==null){
return "";
}
//记录t的大小和次数
Map<Character,Integer> need=new HashMap<>();
//记录窗口的大小和次数
Map<Character,Integer> window=new HashMap<>();
int left=0,right=0; //左右指针
int strnumber=0; //匹配的个数
int minlen=Integer.MAX_VALUE; //最小长度
int start=0; //最短起始指针
//进行t的初始化
for(char c:t.toCharArray()) {
need.put(c,need.getOrDefault(c,0)+1);
}
while(right<s.length()){
char r=s.charAt(right);
right++;
//更新窗口内字符的计数
if(need.containsKey(r)){
window.put(r, window.getOrDefault(r,0)+1);
if (need.get(r).equals(window.get(r))) {
strnumber++;
}
}
//当窗口内的字符已经完全包含了 t 中的所有字符时
while (strnumber==need.size()){
// 更新最小窗口的起始位置和长度
if (right-left<minlen){
start=left;
minlen=right-left;
}
// 缩小窗口,移动左边界
char l=s.charAt(left);
if (window.containsKey(l)){
window.put(l,window.get(l)-1);
if (window.get(l)<need.get(l)) {
strnumber--;
}
}
left++;
}
}
return minlen==Integer.MAX_VALUE? "": s.substring(start,start+minlen);
}
}