基础算法(蓝桥杯)--无敌的双指针

B站视频链接:A18 双指针(尺取法)_哔哩哔哩_bilibili

双指针算法:基础算法(蓝桥杯)--无敌的双指针_第1张图片

基础算法(蓝桥杯)--无敌的双指针_第2张图片 

1、题目:输入一串字符串(有空格),输出用空格隔开的每段字符串.

例:输入abc def gh

       输出:abc

                  def

                  gh

#include 
using namespace std;

char s[1010];


int main(){
	while(~scanf("%s",s))puts(s);//一行搞定输入
	int n=strlen(s),j;
	for(int i=0;i

2、题目:数组的目标和

基础算法(蓝桥杯)--无敌的双指针_第3张图片

#include 
using namespace std;

const int N = 100010;

int n, m;
int a[N], b[N];

int main()
{
    int x;
    cin >> n >> m >> x;
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    for(int i = 0; i < m; i++) scanf("%d", &b[i]);
    //a从小到大枚举,b从大到小枚举,即两头往中间走 
    for(int i = 0, j = m - 1; i < n && j >= 0 ; i++){
        while(a[i] + b[j] > x) j--;//大于x, b往前(j指针往左)移动
        
        if(a[i] + b[j] == x) 
        {
            printf("%d %d", i, j);
            break;
        }
    }
    
    return 0;
}

3、判断子序列

基础算法(蓝桥杯)--无敌的双指针_第4张图片

#include 
using namespace std;

const int N = 100010;

int n, m;
int p[N], s[N];
int cnt;

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++) scanf("%d", &p[i]);
    for(int i = 0; i < m; i++) scanf("%d", &s[i]);
    
    int cnt = 0;
    for(int i = 0; i < m; i ++)//i为p子序列指针, j为s序列指针
    {
        if(cnt < n && s[i] == p[cnt]) cnt ++;//匹配成功就让i ++
        //但是可以把判断条件改成 cnt >= n即匹配成功全部都有 : p的元素s都有
    }
    
    if(cnt >= n) puts("Yes");  //cnt >= n说明全部都有, 大于n说明有重复的 : 前面加上cnt < n的限制则cnt最大为n    
    else puts("No");
    
    return 0;
}

4、题目链接:连续自然数和 - 洛谷 

基础算法(蓝桥杯)--无敌的双指针_第5张图片

#include 
using namespace std;

int main(){
	int m;
	scanf("%d",&m);
	int i,j,sum=1;
	while(i<=m/2){//因为至少两个数 
		if(sum=m){
			if(sum==m)printf("%d %d\n",i,j);
			sum-=i;
			i++;
		}
	}
	
	return 0;
}

 5、A-B数对

基础算法(蓝桥杯)--无敌的双指针_第6张图片

#include 
using namespace std;

const int N=2e5+10;
int n,c,a[N];

int main(){
	cin>>n>>c;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+1+n);//变成有序序列
	 
	long long ans=0;
	for(int k=1,i=1,j=1;k<=n;k++){
		while(i<=n&&a[i]-a[k]

6、题目链接:逛画展 - 洛谷 

 基础算法(蓝桥杯)--无敌的双指针_第7张图片

#include 
using namespace std;

int n,m,a[1000010];
int cnt[2010],num,len,l,r;

int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	
	cnt[a[1]]=1;
	num=1;
	len=1000010;
	for(int j=1,i=1;j<=n;){
		if(numj-i+1){
				len=j-i+1;//更新 
				l=i;
				r=j;
			}
			cnt[a[i]]--;
			if(cnt[a[i]]==0)num--;
			i++;
		}
	}
	
	printf("%d %d\n",l,r);
	
	return 0;
}

 

你可能感兴趣的:(算法,算法,蓝桥杯,数据结构)