以一个例子引入:给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得它们的和恰好为M,输出所有满足条件的方案。
本题一个直观的想法是使用二重循环枚举序列中的整数a和b,判断它们的和是否为M,如果是,输出方案,如果不是,则继续枚举。相应的代码如下:
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[i]+a[j]==M){
printf("%d %d\n",a[i],a[j]);
}
}
}
时间复杂度为。
使用双指针的思想可以很好的解决这个题目。
while(i<j){
if(a[i]+a[j]==m){
cout<<i<<" "<j;
i++;
j--;
}
else if(a[i]+a[j]<m){
i++;
}
else{
j--;
}
}
这样操作的话时间复杂度只有
对于区间合并问题,依然可以使用双指针的思想。假设有两个递增序列A与B,要求将它们合并为一个递增序列C。
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(A[i]<=B[i]){
C[index++]=A[i++];
}
else{
C[index++]=B[j++];
}
}
while(i<n){
C[index++]=A[i++];
}
while(j<m){
C[index++]=B[j++];
}
return index;
}