寻找幸运数字
★实验任务
给出两个已按升序排列的数组 a[1..n],b[1..m],如果存在 i,j,使得 a[i]+b[j]==k,我们便说已找到幸运值。请你判断能不能找到幸运值。
★数据输入
输入第一行为正整数 n,m,k。(1<=k<=10^9) 第二行为 n 个正整数 a[1..n]。(1<=ai<=10^9) 第三行为 m 个正整数 b[1..m]。(1<=bi<=10^9) 80%的数据 1<=n,m<=1000. 100%的数据 1<=n,m<=100000.
★数据输出
如果能找到幸运值,输出 yes。否则输出 no。
测试样例
输入:
3 3 8
1 2 3
4 6 7
输出:yes
解题思路:首先看题暴力求解的复杂度肯定是n2会超时的,然后就可以根据题目中给的另一个小提示两个数列都是升序排列进行优化,升序哦哎lie显然就很容易想到通过二分法可以查找,然后把暴力两个数组都遍历一遍就可以优化成:对一个数组进行遍历,另一个数通过二分法查找,复杂度就可以降到nlogn,就可以解题了。另外一种思路就是根据两个数组都是升序的,通过两个标识(指针)分别从前往后同步对两个数组进行遍历,复杂度是m+n;
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int a[100005], b[100005];
int main()
{
int n, m, k, i, j;
int ok = 0;
cin >> n >> m >> k;
for (i = 0; i < n; i++)cin >> a[i];
for (i = 0; i < m; i++)cin >> b[i];
i = 0, j = m-1;
if (a[n - 1] + b[m - 1]<k || a[0] + b[0]>k)
ok = 0;
else
{
while (i <= n - 1 && j >= 0)
{
if(a[i]+b[j]>k)
{
j--; continue;
}
else if(a[i]+b[j]<k)
{
i++; continue;
}
else
{
ok = 1; break;
}
}
}
if (ok == 1)cout << "yes" << endl;
else cout << "no" << endl;
return 0;
}