滑动窗口要求是我们的窗口大小和对应的窗口序列和需要是单调增的,换个话说就是元素的正负是一致的,我right++之后序列和变大,left--之后序列和变小。
java">import java.io.*;
import java.util.*;
/*
输入 abcabcbb
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
//读入字符串并转化成char数组
char[] g = br.readLine().toCharArray();
Set<Character> set = new HashSet<>();//去重 用HashSet
int ans = 0;//注意如果是空字符串的话应该是0
//滑动窗口模板(不固定长度时候)
//外层循环拓展右边界 内层循环拓展左边界
for(int l=0,r=0;r<g.length;r++){
char ch = g[r];//右指针指向的元素
while(l<=r&&set.contains(ch)){
set.remove(g[l]);
l++;
}
set.add(g[r]);
ans = Math.max(ans,set.size());
}
pw.println(ans);
// return ans;
br.close();
pw.close();
}
}
java">import java.io.*;
import java.util.*;
/*
输入
cbaebabacd
abc
[0,6]
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
//读入字符串并转化成char数组
char[] s = br.readLine().toCharArray();
char[] p = br.readLine().toCharArray();
List<Integer> ans = new ArrayList<Integer>();
if(s.length < p.length)pw.println(ans);
int[] count = new int[26];
for(int i=0;i<p.length;i++)count[p[i]-'a']++;
for(int l=0,r=0;r<s.length;r++){
count[s[r] - 'a'] --;//窗口里面添加这个数了 那么就减去
while(count[s[r] - 'a'] < 0){
count[s[l] - 'a']++;
l ++ ;
}
if(r-l+1 == p.length)ans.add(l);
}
pw.println(ans);
br.close();
pw.close();
}
}
java">import java.io.*;
import java.util.*;
/*
输入
cbaebabacd
abc
[0,6]
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
String[] s_1 = br.readLine().split(" ");
int[] nums = new int[s_1.length];
String s_2= br.readLine();
int k =Integer.parseInt(s_2);
int ans = 0;
int s = 0;
Map<Integer, Integer> cnt = new HashMap<>(nums.length + 1); // 设置容量可以快 2ms
cnt.put(0, 1); // s[0]=0 单独统计
for (int x : nums) {
s += x;
ans += cnt.getOrDefault(s - k, 0);//有key:s-k用s-k的值 否则就用0
cnt.put(s, cnt.getOrDefault(s, 0) + 1);
}
// return ans;
pw.println(ans);
br.close();
pw.close();
}
}
java">import java.io.*;
import java.util.*;
/*
输入
输入1 3 -1 -3 5 3 6 7
3
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
String[] s_1 = br.readLine().split(" ");int[] nums = new int[s_1.length];
String s_2= br.readLine(); int k =Integer.parseInt(s_2);
for(int i=0; i<nums.length; i++)nums[i]=Integer.parseInt(s_1[i]);//记得填充数据
List<Integer> ans = new ArrayList<>();
//滑动窗口 维护窗口内的最大值 双端队列实现
Deque<Integer> q = new ArrayDeque<>();
int n = nums.length;
for(int i=0;i<n;i++){
//如果当前数字比队尾索引对应数字大 去除队尾元素 q.getFirst维护的是最大值的index
while(!q.isEmpty() && nums[q.getLast()] <= nums[i]){
q.removeLast();
}
//不论如何将当前元素的索引加入
q.addLast(i);
//已知长度 左+右- 指的是1
//i是右端点 q.getFrist是左端点
//同时维护队列的队头在滑动窗口中
while(i - q.getFirst() + 1 > k){
q.removeFirst();//出队
}
//当遍历指针走到一个窗口的右边缘 开始记录ans
if(i>=k-1){
ans.add(nums[q.getFirst()]);
}
}
pw.println(ans);
// return ans;
br.close();
pw.close();
}
}