- 给定一个从大到小排序好的数组1,3,4,6,7,8,9,编写算法找出和为11的数字。如果存在多个数字对满足条件,输出任意一对即可。
- 给出三种方法:
- 1、双重循环,对数组进行双重循环,挨个遍历每对数字。当和为11的时候跳出循环。打印结果。
- #include
using namespace std;
void findTwoNmberForSum(int intarr[],int length,int key)
{
for (int i = 0; i < length - 1; i++)
{
for (int j = i + 1; j < length; j++)
{
if (intarr[i] + intarr[j] == key)
{
cout << intarr[i] << " + " << intarr[j] << " = " << key << endl;
return;
}
}
}
}
int main()
{
int intarr[10] = { 1,2,4,7,11,15,17,20,23,25 };
findTwoNmberForSum(intarr, 10, 11);
system(“pause”);
return 0;
}
很简单的一种实现。
2、利用map实现。map的key值为11-intarr[i],然后查找后面是否存在这个key即可。给出代码函数:
void findTwoNmberForSumMap(int intarr[], int length, int key)
{
map<int, int> mapint;
for (int i = 0; i < length; i++)
{
auto iter = mapint.find(intarr[i]);//判断mapint是否存在key-intarr[i],存在就找到了,不存在就添加,一次循环就可以完成。
if (iter != mapint.end())
{
cout << iter->first << " + " << iter->second << " = " << key << endl;
return;
}
else
{
mapint[key - intarr[i]] = intarr[i];
}
}
}
3、由于是排序好的数字,那么可以充分利用这一点来计算,我们给定small=intarr[0],big=intarr[length-1]。然后求small+big是否等于11.小于11的时候,我们就把samll向后移动一次,大于11的时候我们就把big向前移动一位。直到等于11为止。
void findTwoNmberForSumSort(int intarr[], int length, int key)
{
int small = 0;
int big = length - 1;
while (small >= 0 && big < length && small < big)//循环终止条件
{
if (intarr[small] + intarr[big] == key)
{
cout << intarr[small] << " + " << intarr[big]<< " = " << key << endl;
return;
}
if (intarr[small] + intarr[big] > key)//为什么大于的时候big–,我是通过极限的想法理解的,假设数组中没有两数的和==11,且最小的为12,那么smal–,跳出条件不对。当最大的两数和小于11的时候,跳出条件是最大的两数和才行。先这么理解吧。
{
big–;
}
if (intarr[small] + intarr[big] < key)
{
small++;
}
}
cout << “NNN” << endl;
}
我感觉第三种方法很难理解。先这么记着吧
在排序数组中查找和为给定值的两个数字
最新推荐文章于 2023-09-15 15:59:34 发布