和为S的两个数字

深藏阁楼爱情的钟 2022-03-20 03:28 258阅读 0赞

何海涛:《剑指Offer:名企面试官精讲典型编程题》:九度OJ

题目描述:http://ac.jobdu.com/problem.php?cid=1039&pid=23

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输入:

每个测试案例包括两行:

第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int

第二行包含n个整数,每个数组均为int类型。

输出:

对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”

样例输入:

  1. 6 15
  2. 1 2 4 7 11 15

样例输出:

4 11

思想:因为已经排好序,那么如果存在那么两个数,可能是一个比较大,一个比较小,或者是比较相等的两个数!所以我们设一个n1=min(即a[0]),n2=max( 即a[n-1] )开始,实际是n1 = a[low],low=0开始,n2 = a[high],high=n-1开始,然后n1+n2与S(我们需要的和)进行比较,若>,则n2

=a[—high];若<, n1=a[++low],若==,则使用mul保存乘积,还要保存两个数,因为可能不只一对数,它只要乘积小的!扫描直到low>=high终止!

代码AC:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. long int n, i, low, high;
  6. long long int mul;
  7. long int s, *data, m1, m2, flag;
  8. while(scanf("%ld%ld", &n, &s) != EOF )
  9. {
  10. data =( long int* )malloc( sizeof( long int ) * n );
  11. for( i = 0; i < n; i++ ) //
  12. {
  13. scanf("%ld", &data[i]);
  14. }
  15. m1 = -1;
  16. m2 = -1;
  17. low = 0;
  18. high = n - 1;
  19. mul = -1;
  20. flag = 1;
  21. while( low < high ) // 注意:负数和重复的数字( 可以无视 )
  22. {
  23. if( data[low] + data[high] > s )
  24. {
  25. high--;
  26. }
  27. else if( data[low] + data[high] < s )
  28. {
  29. low++;
  30. }
  31. else
  32. {
  33. if( flag )
  34. {
  35. mul = data[low] * data[high];
  36. m1 = data[low];
  37. m2 = data[high];
  38. flag = 0;
  39. }
  40. else
  41. {
  42. if( mul > data[high] * data[low] )
  43. {
  44. mul = data[high] * data[low];
  45. m1 = data[low];
  46. m2 = data[high];
  47. }
  48. }
  49. // printf("%d %d\n", data[low], data[high]);
  50. low++;
  51. high--;
  52. }
  53. }
  54. printf("%ld %ld\n", m1, m2);
  55. free( data );
  56. }
  57. return 0;
  58. }

发表评论

表情:
评论列表 (有 0 条评论,258人围观)

还没有评论,来说两句吧...

相关阅读

    相关 编程题:s数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对

    相关 s数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 由于数组是排序的,采用双指针