51 nod 1001 数组中和等于K的数对
给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对。例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5)。
Input第1行:用空格隔开的2个数,K N,N为A数组的长度。(2 <= N <= 50000,-10^9 <= K <= 10^9) 第2 - N + 1行:A数组的N个元素。(-10^9 <= A[i] <= 10^9)Output
第1 - M行:每行2个数,要求较小的数在前面,并且这M个数对按照较小的数升序排列。 如果不存在任何一组解则输出:No Solution。
Input示例
8 9 -1 6 5 3 4 2 9 0 8Output示例
-1 9 0 8 2 6 3 5时间复杂度降到O(n),值得记录一下
先把数组排序
从两边向中间找
如果两个元素的和小于给的值k,因为后面的已经是最后的元素了,没法再移动了,
所以前面的指针向后移动
如果两个元素的和大于k,移动后面的指针,直到找到为止
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; int A[50005]; int main() { int n,k; scanf("%d%d",&k,&n); int i,j; for(i=0;i<n;i++) { scanf("%d",&A[i]); } int flag=0; sort(A,A+n); int sum=A[0]+A[n-1]; i=0; j=n-1; while(i<j) { if(sum==k) { flag=1; printf("%d %d ",A[i],A[j]); i++; j--; sum=A[i]+A[j]; } else if(sum<k) { i++; sum=A[i]+A[j]; } else { j--; sum=A[i]+A[j]; } } if(!flag) printf("No Solution "); return 0; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。