滑动窗口 + 算法复习

维护一个满足条件的窗口大小,然后进行双指针移动

1.最长子串

题目链接:1.最长子串 - 蓝桥云课

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int k;
signed main()
{
	int max_len=0,left=0;
	cin>>s>>k;
	unordered_map<char,int>nums; //滑动窗口双指针
	for(int right=0; right<s.size(); right++)
	{
		nums[s[right]]++;
		while(nums[s[right]]>k) //如果某个字符的频率超过了 k,则缩小窗口
		{
			nums[s[left]]--;
			left++;
		}
		max_len=max(max_len,right-left+1);
	}
	cout<<max_len<<endl;
	return 0;
}

2.满足条件的子串个数

题目链接:6.满足条件的子串个数 - 蓝桥云课

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int k;
signed main()
{
	int sum=0,left=0;
	cin>>s>>k;
	unordered_map<char,int>nums; //滑动窗口双指针
	for(int right=0; right<s.size(); right++)
	{
		nums[s[right]]++;
		while(nums[s[right]]>k) //如果某个字符的频率超过了 k,则缩小窗口
		{
			nums[s[left]]--;
			left++;
		}
		sum+=(right-left+1); //以新right新形成的好串的数量
//		abc
//		a    a 1
//		ab   b ab 2
//		abc  c bc abc 3
	}
	cout<<sum<<endl;
	return 0;
}

3.区间平均值

题目链接:0区间平均值 - 蓝桥云课

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
signed main()
{
	cin>>t;
	while(t--)
	{
		int n,k;
		int x[110],sum[110];
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>x[i];
			sum[i]=sum[i-1]+x[i];
		}
		cin>>k;
		while(k--)
		{
			int l,r;
			cin>>l>>r;
			printf("%.2f\n",1.0*(sum[r]-sum[l-1])/(r-l+1)); 
		}
	}
	return 0;
} 
相关推荐
wzdark12 小时前
基于堆的优先队列实现原理与复杂度分析4
算法
彧azz14 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
老王熬夜敲代码14 小时前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
hansang_IR14 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
见闻小天地15 小时前
简博斯JG-C系列彩色激光同轴位移计:摄像头模组对位与行程测量的技术价值观察
人工智能·算法
葫三生16 小时前
《论三生原理》神话学构想与“神话历史”理论、《古史中的神话》思路异同?
大数据·人工智能·科技·深度学习·算法
liliangcsdn16 小时前
因子分析指标概念与示例
算法·机器学习
SupL!17 小时前
LoftQ原理
算法
Navigator_Z18 小时前
LeetCode //C - 1240. Tiling a Rectangle with the Fewest Squares
c语言·算法·leetcode
稻米哟18 小时前
力扣100——双指针
算法·leetcode