c语言编程【问题描述】 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 【输入形式】 一个升序排序的数组以空格隔开,以及一个目标数字,换行输入 【输出形式】 如果存在数组中两个数字和为目标数字,则输出数字对; 如果存在多个满足条件的数字对,输入一对即可; 不存在则不输出; 【样例输入】 1 2 4 7 11 15 15 【样例输出】 4 11 【样例说明】 4+11=15 【评分标准】 时间复杂度必须为 O(n),否则酌情给分。
时间: 2024-02-19 18:57:18 浏览: 187
以下是C语言的代码实现:
```c
#include <stdio.h>
void findSum(int arr[], int len, int target) {
int left = 0, right = len - 1;
while (left < right) {
int sum = arr[left] + arr[right];
if (sum == target) {
printf("%d %d\n", arr[left], arr[right]);
return;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
int main() {
int arr[100], len, target;
scanf("%d", &arr[0]);
len = 1;
while (scanf("%d", &arr[len]) == 1) {
len++;
}
scanf("%d", &target);
findSum(arr, len, target);
return 0;
}
```
算法思路:
本题要求找出数组中两个数字之和等于目标数字,且时间复杂度为O(n)。因为数组是升序排序的,所以可以使用双指针法进行查找。定义两个指针left和right,分别指向数组的首尾元素,计算它们的和,如果等于目标数字,则输出这两个数字;如果小于目标数字,则left指针右移;如果大于目标数字,则right指针左移。如此循环直到找到符合条件的数字或者left指针和right指针相遇。
阅读全文