第J题-=数组中等于K的数对(详解) =======给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数

给出一个整数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");
		  }
}

猜你喜欢

转载自blog.csdn.net/lioncatch/article/details/81257162