编程之美读书笔记-快速寻找满足条件的两个数

来源:互联网 发布:淘宝鹊桥下载 编辑:程序博客网 时间:2024/05/11 13:33

本文转载自求在有序数组中查找两个数的和为指定数
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
解析:此题要求是时间复杂度为O(n),意味着只能遍历一次数组,我们要充分利用该数组已经排序的特征。可以从两端同时遍历,对a[begin]+a[end]分3种情况的考虑:(1)大于给定和,则end--;(2)小于给定和,则begin++;(3)相等,则打印结果。

#include<iostream>  using namespace std;     void FindSum(int a[],int length,int sum)  {      int i=0;      int j=length-1;      bool flag=false;        while(i<j)      {          int result=a[i]+a[j];          if(result>sum) --j;          else if(result<sum) ++i;          else if(result==sum)          {              flag=true;              break;          }      }      if(flag) cout<<a[i]<<" "<<a[j]<<endl;      else cout<<"not find"<<endl;  }     int main()  {      int a[]={1,2,4,7,11,15};      int len=sizeof(a)/sizeof(a[0]);      FindSum(a,len,15);  }


0 0
原创粉丝点击