题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
#pragma warning(disable:4996)
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define N 1005
int a[N];
int main()
{
#ifdef local
freopen("data.txt", "r", stdin);
#endif
int n;
int r = 0;
scanf("%d", &n);
while (~scanf("%d", &a[r++]));
int l = 0;
r--;
while(l < r)
{
if (a[l] + a[r] > n) r--;
else if (a[l] + a[r] == n)break;
else l++;
}
if (l != r && a[l] + a[r] == n)
{
printf("%d %d\n", a[l], a[r]);
}
else
{
printf("none\n");
}
}
上面这种写法不理解可以看这种
#pragma warning(disable:4996)
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define N 1005
int a[N];
int main()
{
#ifdef local
freopen("data.txt", "r", stdin);
#endif
int n;
int r = 0;
scanf("%d", &n);
while (~scanf("%d", &a[r++]));
int l = 0;
r--;
while (l < r)
{
int other = n - a[l];
while (l < r && a[r] > other) r--;
if (l == r || a[r] == other) break;
other = n - a[r];
while (l < r && a[l] < other) l++;
if (l == r || a[l] == other) break;
}
if (l != r && a[l] + a[r] == n)
{
printf("%d %d\n", a[l], a[r]);
}
else
{
printf("none\n");
}
}
如果是乱序而且不可以排序,那就哈希一下就好了。