检测数组里是否有两个数之和等于某个数

 我来答
藩熹纵含烟
2020-01-25 · TA获得超过3806个赞
知道大有可为答主
回答量:3120
采纳率:29%
帮助的人:433万
展开全部
[算法C++]
检测数组里是否有两个数之和等于某个数
解决方法一:先将数组排序,然后从两头开始遍历
数组排序后,从左端开始取最小值,从右端取最大值,
判断两者之和与目标的大小:
1.
等于时,输出两个数;
2.
大于时,右端移到第2个数,继续判断;
3.
小于时,左端移到第2个数,继续判断。
#include
#include
#include
using
namespace
std;
void
fun1(int
a[],
int
length,
int
target)
{
//
给数组排序
sort(a,
a
+
length);
//
left是最小值,right是最大值
int
left
=
0,
right
=
length
-
1;
while
(left
<
right)
{
int
tmp
=
a[left]
+
a[right];
if
(tmp
==
target)
{
cout
<<
a[left]
<<
a[right]
<<
endl;
return;
}
else
if
(tmp
>
target)
{
//
和比目标大,就减小right,从而减小和
right--;
}
else
{
//
和比目标小,就增大left,从而增大和
left++;
}
}
cout
<<

<<
endl;
}
int
main()
{
int
a[]
=
{
1,
3,
2,
7,
6,
9,
8,
0,
5,
4
};
int
target
=
0;
while
(cin
>>
target)
{
fun1(a,
10,
target);
}
}
上述方法虽然简单,但弊端也有,没法输出所有等于目标值的两个数。
解决方法二:
暴力解法,记录下每一个数与其他数的和放在一个二维数组里,然后遍历即可,这样可以记录下所有的和等于目标值的数值对,如下:
假设输入数组为:
2
3
4
5
1
有如下矩阵:
2
3
4
5
1
2
-
5
6
7
3
3
5
-
7
8
4
4
6
7
-
9
5
5
7
8
9
-
6
1
3
4
5
6
-
当目标值为7时,就有两组:
(5,2)与(3,4)
考虑到对称性,有n[i][j]
=
n[j][i],i!=j,
,所以,我们只需要i>j的数值对就行。
void
fun2(int
a[],
int
length,
int
target)
{
int**
n
=
new
int*[length];
for
(int
i
=
0;
i
<
length;
i++)
{
n[i]
=
new
int[length];
}
for
(int
i
=
0;
i
<
length;
i++)
{
for
(int
j
=
length
-
1;
j
>
i;
j--)
{
n[i][j]
=
n[j][i]
=
a[i]
+
a[j];
}
}
for
(int
i
=
0;
i
<
length;
i++)
{
for
(int
j
=
length
-
1;
j
>
i;
j--)
{
if
(n[i][j]
==
target)
{
cout
<<
a[i]
<<
<<
a[j]
<<
endl;
}
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式