阿里在线笔试求最接近sum值的最快平均时间复杂度
给定一个整数sum,从有N个有序元素的数组中寻找元素a、b,使得 a+b 的结果最接近sum,最快的平均时间复杂度是O(N)。
实现代码如下:
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <string> #include <cstdlib> #include <algorithm> #include <map> #include <set> #include <utility> #include <vector> #include <queue> using namespace std; #define ll long long const int N=100005; const int A=100000; ll a,b; //目标值 ll x[N]; ll sum; ll n; int main() { // freopen("data.in","r",stdin); scanf("%I64d%I64d",&n,&sum); a=1;b=n; ll i,j; for(i=1;i<=n;i++){ scanf("%I64d",&x[i]); } i=1;j=n; a=x[1];b=x[n]; ll anssum=x[1]+x[n]-sum; if(anssum<0) anssum=-anssum; ll te; while(i<j) //这里不能i<=j,谨记 { if(x[i]+x[j]==sum) { a=x[i]; b=x[j]; break; } else if(x[i]+x[j]>sum) { j--; } else { te=x[i]+x[j]-sum; if(te<0) te=-te; if(te<anssum) { anssum=te; a=x[i];b=x[j]; } if(j!=n) { te=x[i]+x[j+1]-sum; if(te<0) te=-te; if(te<anssum) { anssum=te; a=x[i];b=x[j+1]; } } i++; } } printf("a=%I64d b=%I64d\n",a,b); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
posted on 2015-04-08 15:18 Tob__yuhong 阅读(191) 评论(0) 编辑 收藏 举报