欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

two pointers

程序员文章站 2022-03-11 18:16:46
...

two pointers 是一种编程技巧,可以提高算法效率
一个栗子 给定一个递增的正整数序列,和一个正整数M,求序列中的两个不同位置的数a和数b,使得他们的和恰好为M,输出所有满足条件的方案,比如{1,2,3,4,5,6},M=8 就存在 2+6=8 ,3+5 =8;
最直观的做法是二重循环枚举

 for(int i=0;i<n;i++){
 	for(int j= i+1;j<n;j++){
 		if(a[i]+a[j] == M)
 		cout<<a[i]<<' '<<a[j];
	 }
 }

但是这样的时间复杂度为O(N^2)在数大的时候不可取
另一种做法

int i=0,j=n-1;
while(i<j){
	if(a[i]+a[j] == M ) {
		cout<<i<<j;
		i++;
		j--;
	}
	else if(a[i]+a[j] > M) j--;
	else i++;
	
}

做法很简单,但是时间复杂度确实0(n)的级别,其实我一开始想的是用set做,然后用count(M-*it)在不在数组里面,我感觉这两种做法思想都差不多,算然这种做法很简单,但是给我的启发还是很大的,起码知道了一种算法思想
2.序列合并问题
假设有2个递增的序列A,B要求将他们合并成一个递增序列C
思想都差不多

int meger(int a[], int b[],int c[],int n,int m){
	int i=0,j=0,k=0;
	while(i <n && j < m){
	if(a[i]<=b[j]){
		c[k++]=a[i++];
	}
	else{
		c[k++]=b[j++]
	}
	while(i<n) c[k++] = a[i++];
	while(j<m) c[k++] = b[j++];
	return k;
	
}
}

看完这个我就想起来了刚学链表,做链表合并的题目的时候也是这种思想,只是链表还要加上其他的东西,做法都是一样的