查找数组中两个位置不同的数字之和为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++];
}
}