Chinaunix首页 | 论坛 | 博客
  • 博客访问: 505820
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-07-04 09:25:42

输入一个整数数组与一个整数,在数组中查找和为该整数的所有整数对.
方法:排序夹逼:数组有序,直接由俩个指针分别从头和尾向中间扫描的方法,时间复杂度是O(n),空间复杂度是O(1)。总的时间复杂度(o(nlgn+n) = o(nlgn))。这里用到c语言的qsort()。
c代码如下:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. void findsum(int *a,int n,int sum)
  5. {
  6.     int begin = 0,end = n-1;
  7.     while (begin < end)
  8.     {    
  9.         int cursum = a[begin]+a[end];
  10.         if (cursum == sum)
  11.         {
  12.             printf("%d %d\n",a[begin],a[end]);
  13.             //continue;
  14.             begin++;
  15.             end--;
  16.         }    
  17.         else if (cursum > sum)
  18.         {
  19.             end--;
  20.         }
  21.         else
  22.         {
  23.             begin++;
  24.         }
  25.     }
  26. }
  27. int cmp ( const void *a , const void *b )

  28. { return *(int *)a - *(int *)b; }

  29. //qsort(num,100,sizeof(num[0]),cmp);
  30. int main()
  31. {
  32.     printf("请输入数组长度:");
  33.     int len = 0;
  34.     scanf("%d",&len);
  35.     int a[len];
  36.     memset(a,0,len);
  37.     int i = 0;
  38.     for (i = 0;i < len;i++)
  39.     {
  40.             printf("请输入第%d个元素:",i+1);
  41.             scanf("%d",&a[i]);
  42.     }
  43.     qsort(a,len,sizeof(a[0]),cmp);
  44.     int sum = 0;    
  45.     printf("请输入定植sum:");
  46.     scanf("%d",&sum);
  47.     findsum(a,len,sum);
  48.     return 0;
  49. }
执行结果如下(centos5.5)
[root@localhost c++]# ./findsum 
请输入数组长度:10
请输入第1个元素:4
请输入第2个元素:3
请输入第3个元素:2
请输入第4个元素:1
请输入第5个元素:5
请输入第6个元素:4
请输入第7个元素:3
请输入第8个元素:3
请输入第9个元素:2
请输入第10个元素:1
请输入定植sum:5
1 4
1 4
2 3
2 3
[root@localhost c++]# 

阅读(659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~