给出一个整数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 <= Aii <= 10^9)
Output
第1 - M行:每行2个数,要求较小的数在前面,并且这M个数对按照较小的数升序排列。
如果不存在任何一组解则输出:No Solution。
Sample Input
8 9
-1
6
5
3
4
2
9
0
8
Sample Output
-1 9
0 8
2 6
3 5
上思路:
1.给一个数组,先将其从小到大排序【】
2.将第一个数与最后一个数相加比较其和与题定值的大小,若大于则应改小点,前一位不变,将最后一位换成倒数第二位,重复,直到等于或小于题定值,等于则输出,小于则退出循环,开始第二位
3.若第一次循环结束,第一位比较到倒数第k个数,则因第二位比第一位大,所以第二位不再从最后一位开始相加,直接比较第二位和倒数第k位的和
4.若相加时,前面和后面重合或前面大于后面,退出循环,因为不能有重复的
C++:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
long long a[50010],k;
int main()
{
scanf("%lld%d",&k,&n);
bool temp=false;
for(int i=1;i<=n;i++)//从第一位开始录入
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){//核心代码
if((a[i]+a[n])<k)continue;//如果相加小于题定值,退出本次循环
for(int j=i+1;j<=n&&a[i]+a[j]<=k;j++){
if(a[i]+a[j]==k){
temp=true;
printf("%lld %lld\n",a[i],a[j]);
}
}
}
if(!temp)printf("No Solution\n");
return 0;
}
JAVA:不建议,耗时长,辅助理解
import java.util.Arrays;
import java.util.Scanner;
public class paixu {
public static void main(String []ages)
{
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();//题定值
int n=sc.nextInt();
int arr[]=new int[n];
for(int i=0;i<n;i++)
arr[i]=sc.nextInt();
Arrays.sort(arr);//排序
int i=0;int dex=1;//dex为判断是否有配对的,有为0
while(i!=n-1)//核心代码 i为第相加时前一个值,n-1为后一个值
{
if(arr[i]+arr[n-1]==num)//有配对的
{
dex=0;//若有置0
System.out.println(arr[i]+" "+arr[n-1]);
i++;//开始下一个循环
}
else if(arr[i]+arr[n-1]>num)//如果相加大的话就前移
n--;
else//小于题定值
i++;
}
if(dex==1)//如果没有
System.out.println("No Solution");
}
}