Two pointers技巧的应用

查找数组中两个位置不同的数字之和为sum的个数。


先来看看暴力法,粗略估计,时间复杂度为0(n^2).

void violence(int *a,int totalnumber,int sum)
{
	int count=0;//计算不匹配的结果次数
	for(int i=0;i<totalnumber-1;++i)
	{
		for(int j=i+1;j<totalnumber;++j)
		{
			if(a[i]+a[j]==sum)
			{
				cout<<a[i]<<"+"<<a[j]<<"="<<sum<<endl;
			}
			else
			{
				count++;
			}
		}
	}
	cout<<count<<endl;
}

来看看主函数测试的结果:


不匹配次数是41次,嗯,看起来结果还不错的样子。


来看看two pointers的做法

void two_pointers(int *a,int start,int end,int sum)
{
	int count=0;
	while(start<end)
	{
		if(a[start]+a[end]==sum)
		{
			cout<<a[start]<<"+"<<a[end]<<"="<<sum<<endl;
			++start;
			--end;
		}
		else if(a[start]+a[end]<sum)
		{
			count++;
			++start;
		}
		else
		{
			count++;
			--end;
		}
	}
	cout<<count<<endl;
}


呶,不匹配2次,比暴力法要快多了,亲们,是不是能看出two pointers的潇潇技巧呢?


顺便再来看看实现两个有序序列的合并吧。

void merge(int *b,int b_len,int *c,int c_len,int *d)
{
	int i=0,j=0,c_index=0;
	while(i<b_len&&j<c_len)
	{
		if(b[i]<=c[j])
		{
			d[c_index++]=b[i++];
		}
		else
		{
			d[c_index++]=c[j++];
		}
	}
	while(i<b_len)
	{
		d[c_index++]=b[i++];
	}
	while(j<c_len)
	{
		d[c_index++]=c[j++];
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值