1.常见双指针
· 同向,两个指针向同一个方向移动,例如都从数组小下标移向大下标。
· 相向,两个指针分别从左右两端向中间移动。
2.例题一(同向) ——力扣 922 按奇偶排序数组
(1)题目链接
(2)代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,even,odd,a[20010]; //even奇, odd偶
int main()
{
cin>>n;
for (int i=0;i<n;i++)
cin>>a[i];
even=1,odd=0; //根据题目要求, 第一个偶数位下标是0
while (even<n && odd<n)
{
if (a[n-1]%2!=0) //永远只针对最后一个数去交换
{
swap(a[even],a[n-1]);
even+=2; //移动奇指针
}
else
{
swap(a[odd],a[n-1]);
odd+=2; //移动偶指针
}
}
for (int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
3.例题二(相向)——力扣 881 救生艇
(1)题目链接
(2)代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,limit,ans,l,r,a[50010];
int main()
{
cin>>n>>limit;
for (int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for (l=1,r=n;l<=r;)
{
if (l==r) //特判 当最后只剩一个人, 及时break, 防止算两次
{
ans++;
break;
}
if (a[l]+a[r]>limit) //重的那个人只能单独一条船
{
ans++;
r--; //移向次重的人
}
else
{
ans++;
l++,r--;
}
}
cout<<ans;
return 0;
}
(3)分析
本题实质是贪心,借助双指针算法来实现。
为了是船数量最少,应使得每艘船都空间最大化利用,因此应将最轻与最重搭配。
有时双指针技巧会包含单调性(贪心)方面的考虑。