您的位置:首页 > 编程语言

编程之美2.12 快速寻找满足条件的两个数

2013-04-21 15:19 375 查看
1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。

如:5 6 1 4 7 9 8 sum=10

2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。

如:5 6 1 4 7 9 8 sum=15

1、解法一:

空间换时间,采用hash的方法;扫描数组,找出其中最大值max,申请max长度的空间,例:5,6,1,4,7,9,8

max=9;

定义数组 num[0----9]初始化为0,然后扫描数组将num[i]赋值,如果i存在,则num[i]++,否则,num[i]=0.

代码如下:

#include<iostream>
using namespace std;
#define N 10
int main()
{
int array
;
int *num;
int i;
int max=0;
int temp=-1;
int count;
cout<<"请输入"<<N<<"个数字"<<endl;
for (i=0;i<N;i++)
{
cin>>array[i];
}
cout<<"请给定一个SUM:";
cin>>count;
num=(int *)malloc(sizeof(int));
for (i=0;i<N;i++)
{
if (array[i]>max)
{
max=array[i];
}
if (array[i]<0)//数组中有负数的情况
{
if (abs(array[i])>=temp)
{
temp=abs(array[i]);
}

}
}
if (max+temp<N)
{
max=N;
temp=0;
}
num=(int *)realloc(num,sizeof(int)*(max+temp+2));
memset(num,0,sizeof(int)*(max+temp+2));//初始化0
for (i=0;i<N;i++)
{
if (array[i]>=0)
{
num[array[i]]++;
}
else
{
num[max+abs(array[i])]++;
}

}
for (i=0;i<N;i++)
{
if (count-array[i]>=0)
{
if (num[count-array[i]]!=0)
{
if ((count-array[i])==(array[i]))
{
if (num[count-array[i]]>=2)
{
cout<<array[i]<<" "<<count-array[i];
break;
}
}
else
{
cout<<array[i]<<" "<<count-array[i];
break;
}

}
else
{
continue;
}
}
else//数组中有负数的情况
{
if (num[max+abs(count-array[i])]!=0)
{
if ((count-array[i])==(array[i]))
{
if (num[max+abs(count-array[i])]>=2)
{
cout<<array[i]<<" "<<count-array[i];
break;
}
}
else
{
cout<<array[i]<<" "<<count-array[i];
break;
}

}
else
{
continue;
}
}
}
if (i==N)
{
cout<<"不存在";
}
cout<<endl;
free(num);
return 0;
}


方法二、先对数组排序,O(NlogN )

然后采用快速排序的思想,i=0,j=N-1,array[i]+array[j]==sum,返回,否则,>sum,则j--,           <sum,则i++,O(N)

代码如下:总时间复杂度O(NlogN)

#include<iostream>
#include<algorithm>
using namespace std;
#define N 10
int main()
{
int array
;
int i,j;
int sum;
cout<<"请输入"<<N<<"个数字"<<endl;
for (i=0;i<N;i++)
{
cin>>array[i];
}
cout<<"请给定一个SUM:";
cin>>sum;
sort(array,array+N);//O(NlogN)
for (i=0,j=N-1;i<j;)
{
if (array[i]+array[j]==sum)
{
cout<<array[i]<<" "<<array[j]<<endl;
break;
}
else
{
if (array[i]+array[j]>sum)
{
j--;
}
else
{
i++;
}
}
}
if (i==j)
{
cout<<"不存在"<<endl;
}
return 0;
}


 

2、解法,设三个数为a,b,c ,和sum,按照上面第二种解法,array[i]+array[j]==sum-c=a+b

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: