Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4842617
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-07-21 09:54:50

    输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
   例如输入数组12471115和数字15。由于4+11=15,因此输出411
   这题就比较简单了。当然肯定不是先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n*n)
    最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。
   

#include <stdio.h>
#include <stdlib.h>

#define N 6
void find_sum(int A[], int sum)
{
  int i = 0;
  int j = N-1;
  int k;
  
 while( i!=j)
 {
  k = A[i]+A[j];
  if(k == sum)
   {
     printf("%d + %d = %d\n",A[i],A[j],sum);
     return;
   }
  else if(k<sum)
   i++;
  else
   j--;
 }
 
 printf("sorry not found\n");
}
int main(int argc, char *argv[])
{
  int A[] = {1, 2, 4, 7, 11, 15};
  int sum = 15;
  
  find_sum(A, sum);
  system("PAUSE");    
  return 0;
}

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