给出一个有 n 个元素的数列 a 和一个整数 s ,其中数列 a 的元素是按照升序排列的。 请你在数列中找出两个元素 x,y 使得 x+y=s 。 输入 输入第一行一个整数 n(1≤n≤105) ,表示数列中的元素个数。 接下来一个输入 n 个空格隔开的整数,表示输入的数列 a ,保证是升序排列,并且−109≤ai≤109 。 接下来一行输入一个整数 s(−109≤s≤109)。 输出 如果能找到满足条件的两个数,输出 "Yes" ,否者输出 "No" 。c语言回答
时间: 2024-03-22 18:39:26 浏览: 90
可以使用双指针来解决这个问题,时间复杂度为 O(n)。具体做法是:设置左指针 l 和右指针 r 分别指向数列的第一个元素和最后一个元素,每次将它们指向的元素相加,如果和小于 s,则将 l 向右移动一位;如果和大于 s,则将 r 向左移动一位;如果和等于 s,则找到了满足条件的两个数,输出 "Yes"。如果左指针和右指针相遇仍然没有找到,则输出 "No"。
以下是 C 语言的代码实现:
```
#include <stdio.h>
int main() {
int n, s;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &s);
int l = 0, r = n - 1;
while (l < r) {
int sum = a[l] + a[r];
if (sum == s) {
printf("Yes\n");
return 0;
} else if (sum < s) {
l++;
} else {
r--;
}
}
printf("No\n");
return 0;
}
```
阅读全文