问题描述:输入一个数组A[0…N-1]和一个数字Sum,在数组中查找n个数使得他们的和为Sum。
1.n=2(找两个数)
1)直接暴力法
实现思路:直接遍历整个数组,让每一个数字和其他数组相加,如果和为Sum,输出;否则,接着遍历。
实现方法如下:
void FindAandB(int a[], int n,int sum) {
int flag = 0;
for (int i = 0; i < n-1; i++)
{
for (int j = i + 1; j < n; j++) {
if (a[i]+a[j]==sum)
{
cout << a[i] << " " << a[j] << endl;
flag = 1;
break;
}
}
if (flag)
{
break;
}
}
}
2)上述算法的稍加改进
实现思路:先对整个数组进行排序,然后使用两个索引i,j分别指向数组的开头和结尾,如果a[i]+a[j]>Sum,则j–;如果a[i]+a[j]<Sum,则i++,如果相等,则输出,循环的退出条件是i>=j时突出循环或者找到满足条件的两个元素。
实现方法如下:
void findAandB1(vector<int> a, int n, int sum) {
sort(a.begin(), a.end());//排序
int i = 0; int j = n - 1;
while (i<j)
{
if (a[i] + a[j] > sum)
j--;
else if (a[i]+a[j]<sum)
{
i++