来源:牛客网-哔哩哔哩笔试题
[编程题]找出有序数组中和为sum的两个数
热度指数:427时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M
算法知识视频讲解
找出有序数组(从小到大排列)中和为sum的两个数,要求复杂度为O(n),找到一组即可
输入描述:
第一行:数组长度
第二行:数组各项的值
第三行:sum
输出描述:
若存在,输出和为sum的两个数,以空格分隔;若不存在,输出notfound
示例1
输入
5
1 3 4 6 8
10
输出
4 6
示例2
输入
5
1 3 4 6 8
13
输出
notfound
二分解法:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;</algorithm></iostream>
int main(){
int n,sum,k;
scanf("%d",&n);
int a[n];
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
scanf("%d",&sum);
sort(a,a + n);
for(k = 0;k < n;k++){
int tem = sum - a[k],l=k+1,r = n;
if(tem <= 0){printf("notfound");break;}
while(l < r){
int mid = (l+r)>>1;
if(tem == a[mid]){
printf("%d %d",sum-tem,a[mid]);tem = 0;
break;
}
else if(tem > a[mid]){
l = mid+1;
}
else{
r = mid;
}
}
if(tem==0)break;
}
if(k == n)printf("notfound");
}