双指针问题5(c++)

概念

双指针,顾名思义,就是用两个指针解决问题

有些问题用单指针会出现超时等问题 ,这时就需要用到双指针

双指针由两个指针组成 ,一般是左右指针 ,或前后指针

通过两个指针配合变化,用更短的时间高效解决问题

题目

(续上一篇,如需了解上一篇题目,请移步主页观看)

合并有序数组

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int la,lb,lab;
int a[20010],b[10010];

int main()
{
	cin>>la;
	for(int i = 1;i<=la;i++)
	{
		cin>>a[i];
	}
	cin>>lb;
	for(int i = 1;i<=lb;i++)
	{
		cin>>b[i];
	}
	lab = la+lb;
	int ai = la+1,bi = lb+1,abi = lab+1;
	while(ai>1&&bi>1)
	{
		if(a[ai-1]>b[bi-1]) a[--abi] = a[--ai];
		else a[--abi] = b[--bi];
	}
	while(bi>1) a[--abi] = b[--bi];
	for(int i = 1;i<=lab;i++) cout<<a[i]<<" ";
	return 0;
}

完美数列

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,p;
int a[10010];

int main()
{
	cin>>n>>p;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	int fast = 0,slow = 1;
	int ma,mi;
	mi = a[slow];
	int mama = -999999999;
	while(fast<n)
	{
		while(fast<n)
		{
			ma = a[++fast];
			int x = mi*p;
			if(ma<=x) mama = max(mama,fast-slow+1);
			else break;
		}
		while(slow<fast)
		{
			mi = a[++slow];
			int x = mi*p;
			if(ma<=x)
			{
				mama = max(mama,fast-slow+1);
				break;
			}
		}
	}
	cout<<mama;
	return 0;
}

反转元音字母

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
string a;
char yy[] = {'a','e','i','o','u'};

int main()
{
	cin>>a;
	int n = a.size();
	int l = 0,r = n-1;
	while(l<r)
	{
		bool lf = false;
		bool rf = false;
		for(int i = 0;i<5;i++)
		{
			if(a[l]==yy[i]) lf = true;
			if(a[r]==yy[i]) rf = true;
		}
		if(lf==false) l++;
		if(rf==false) r--;
		if(lf==true&&rf==true)
		{
			swap(a[l],a[r]);
			l++;
			r--;
		}
	}
	cout<<a;
	
	
	return 0;
}

验证回文串2

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
string a;
int n;
bool chushi();
bool hou(int,int);
int main()
{
	cin>>a;
	n = a.size();
	if(chushi()==true) cout<<"true";
	else cout<<"false";
	return 0;
}
bool chushi()
{
	int l = 0,r = n-1;
	while(l<r)
	{
		if(a[l]==a[r]) l++,r--;
		else
		{
			if((hou(l+1,r)|hou(l,r-1))==true) return true;
			else return false;
		}
	}
	return true;
}
bool hou(int l,int r)
{
	while(l<r)
	{
		if(a[l]==a[r]) l++,r--;
		else return false;
	}
	return true;
}

最接近的三数之和

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[10010],target,misum,micha;

int main()
{
	micha = 999999999;
	cin>>n;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i];
	}
	cin>>target;
	sort(a+1,a+n+1);
	for(int i = 1;i<=n-2;i++)
	{
		int l = i+1,r = n;
		while(l<r)
		{
			int sum = a[l]+a[i]+a[r];
			int cha = sum-target;
			if(cha<0) cha = target-sum,l++;
			else r--;
			if(cha<micha)
			{
				micha = cha;
				misum = sum;
			}
		}
	}
	cout<<misum;
	
	return 0;
}
相关推荐
一只小小的芙厨6 小时前
AT_tkppc3_d 巨大チェスボード 题解
c++·题解
我在人间贩卖青春6 小时前
C++之继承与派生类的关系
c++·向上造型·向下造型
Trouvaille ~6 小时前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
_OP_CHEN6 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82186 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER6 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
EmbedLinX6 小时前
嵌入式之协议解析
linux·网络·c++·笔记·学习
xhbaitxl6 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone6 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc
wangjialelele6 小时前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发