本篇摘录总结自《算法笔记》胡凡
示例一
给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得它们的和恰好为M,输出所有满足条件的方案。
C/C++代码
void print_add_number(int a[], int length, int M)
{
int i=0, j=length-1;
while (i<j)
{
if (a[i]+a[j]==M)
{
printf("%d %d\n",a[i],a[j]);
i++;
j--;
}
else if (a[i]+a[j]<M)
{
i++; // 使和的值变大
}
else // a[i]+a[j]>M
{
j--; // 使和的值变小
}
}
}
示例二
序列合并问题:假设有两个递增序列A与B,要求将它们合并为一个递增序列C。
C/C++代码
int merge(int A[],int B[],int C[],int n,int m)
{
int i=0,j=0,index=0; // i指向A[0],j指向B[0]
while (i<n && j<m)
{
if (A[i]<=B[j])
{
C[index]=A[i];
index++;
i++;
}
else //A[i]>B[j]
{
C[index]=B[j];
index++;
j++;
}
}
while (i<n)
{
C[index]=A[i];
index++;
i++;
}
while (j<m)
{
C[index]=B[j];
index++;
j++;
}
}
C/C++可运行示例
#include <cstdio>
// two pointers
// 给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,
// 使得它们的和恰好为M,输出所有满足条件的方案。
void print_add_number(int a[], int length, int M)
{
int i=0, j=length-1;
while (i<j)
{
if (a[i]+a[j]==M)
{
printf("%d %d\n",a[i],a[j]);
i++;
j--;
}
else if (a[i]+a[j]<M)
{
i++; // 使和的值变大
}
else // a[i]+a[j]>M
{
j--; // 使和的值变小
}
}
}
// 序列合并问题:假设有两个递增序列A与B,要求将它们合并为一个递增序列C。
int merge(int A[],int B[],int C[],int n,int m)
{
int i=0,j=0,index=0; // i指向A[0],j指向B[0]
while (i<n && j<m)
{
if (A[i]<=B[j])
{
C[index]=A[i];
index++;
i++;
}
else //A[i]>B[j]
{
C[index]=B[j];
index++;
j++;
}
}
while (i<n)
{
C[index]=A[i];
index++;
i++;
}
while (j<m)
{
C[index]=B[j];
index++;
j++;
}
}
int main(void)
{
int a[6]={1,2,3,4,5,6};
print_add_number(a,6,8);
int b[4]={2,4,6,8};
int c[10];
merge(a,b,c,6,4);
for(int i=0;i<10;i++)
{
printf("%d ",c[i]);
}
return 0;
}