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[N];
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[N];
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
本文介绍两种高效算法来解决数组中寻找两数之和等于特定值的问题,并扩展到寻找三数之和的情形。第一种算法利用哈希表进行空间换时间的优化,第二种算法则通过对数组排序并使用双指针技术来解决问题。

被折叠的 条评论
为什么被折叠?



