双指针算法(Two Pointers)
算法思想: 利用问题本身与序列的特性(序列递增性质),使用两个下标i、j对序列进行扫描 (可以同向扫描,也可以反向扫描) ,以较低的复杂度解决问题。
TIPS:要注意双指针的方向选择!!!
eg1. 给定一个递增的正整数序列和一个正整数M,求序列中不同位置的数a和b,是的它们的和恰好为M,输出所有满足条件的方案。
// 两个指针反向扫描
while(i < j)
{
if(a[i]+a[j] == M)
{
printf("%d %d\n", i, j);
i++; // 如果只需要第一个解,直接break即可。
j--;
}
else if(a[i]+a[j] < M)
{
i++;
}
else
{
j--;
}
}
eg2. 序列合并问题
// 两个指针同向扫描
int merge(int A[], int B[], int C[], int n, int m)
{
int i = 0, j = 0, index = 0;
while(i<n && j<m)
{
if(