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

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

双指针算法:

 

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

例:输入abc def gh

       输出:abc

                  def

                  gh

#include <bits/stdc++.h>
using namespace std;

char s[1010];


int main(){
	while(~scanf("%s",s))puts(s);//一行搞定输入
	int n=strlen(s),j;
	for(int i=0;i<n;i++){//i为快指针 
		while(j<n&&s[j]!=' ')j++;//j为快指针
		for(int k = i; k < j; k++ )printf("%c", s[i]);
		i=j;// 一段结束后快慢指针指向同一位置 
	} 
	return 0;
}

2、题目:数组的目标和

#include <bits/stdc++.h>
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、判断子序列

#include <bits/stdc++.h>
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、题目链接:连续自然数和 - 洛谷 

#include <bits/stdc++.h>
using namespace std;

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

 5、A-B数对

#include <bits/stdc++.h>
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]<c)i++;//左端点
		while(j<=n&&a[j]-a[k]<=c)j++;//右端点+1
		ans+=j-i; 
	}
	
	cout<<ans<<endl;
	
	return 0;
}

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

 

#include <bits/stdc++.h>
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(num<m){
			j++;
			cnt[a[j]]++;
			if(cnt[a[j]]==1)num++;
		}
		if(num==m){
			if(len>j-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;
}

 

相关推荐

  1. -指针

    2024-02-13 11:52:01       38 阅读
  2. 基础算法(二)#

    2024-02-13 11:52:01       40 阅读
  3. 基础算法(三)#

    2024-02-13 11:52:01       42 阅读
  4. 二进制王国【算法周赛】

    2024-02-13 11:52:01       43 阅读
  5. 算法

    2024-02-13 11:52:01       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-13 11:52:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-13 11:52:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-13 11:52:01       87 阅读
  4. Python语言-面向对象

    2024-02-13 11:52:01       96 阅读

热门阅读

  1. 14.4 OpenGL图元装配和光栅化:点

    2024-02-13 11:52:01       46 阅读
  2. C# 【WPF】之 INotifyPropertyChanged的简单封装

    2024-02-13 11:52:01       68 阅读
  3. Android录音功能的实现及踩坑记录

    2024-02-13 11:52:01       51 阅读
  4. [日常使用] Shell常用命令

    2024-02-13 11:52:01       46 阅读
  5. STM32自学☞PWM驱动舵机(按键控制)

    2024-02-13 11:52:01       49 阅读
  6. Rust语言之哈希表

    2024-02-13 11:52:01       64 阅读
  7. stream流中distinct方法重写equals相关

    2024-02-13 11:52:01       53 阅读
  8. 速盾cdn:香港服务器如何用国内cdn

    2024-02-13 11:52:01       48 阅读