能否快速的在数组中找到两个数,让这两个数之和等于一个给定的数字。

解法1、

一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为
给定的数字。 
显然其时间复杂度为N(n-1)/2即O(N^2)。这个算法很简单,写起来也很容
易,但是效率不高。一般在程序设计里面,要尽可能降低算法的时间和空间复杂度,
所以需要继续寻找效率更高的解法。

vector<double>  mindifference(double arr[], int n, int num)
{vector<double>result;for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){if (arr[i] + arr[j] == num){result.push_back(arr[i]);result.push_back(arr[j]);break;}}}return result;
}

解法二 
求两个数字之和,假设给定的和为Sum。一个变通的思路,就是对数组中的每个
数字arr[i]都判别Sum-arr[i]是否在数组中,这样,就变通成为一个查找的算法。

vector<double>  mindifference(double arr[], int n, int num)
{int index;vector<double>result;for (int i = 0; i < n; i++){index = arr.find(num - arr[i]);if (index != NULL){result.push_back(arr[i]);result.push_back(arr[index]);break;}}return result;
}

解法三 
还可以换个角度来考虑问题,假设已经有了这个数组的任意两个元素之和的有
序数组(长为N^2)。那么利用二分查找法,只需用O(2*log2N)就可以解决这个
问题。当然不太可能去计算这个有序数组,因为它需要O(N^2)的时间。但这个思
考仍启发我们,可以直接对两个数字的和进行一个有序的遍历,从而降低算法的时
间复杂度。 
首先对数组进行排序,时间复杂度为(N*log2N)。 
然后令i = 0,j = n-1,看arr[i] + arr[j] 是否等于Sum,如果是,则结束。如果小于
Sum,则i = i + 1;如果大于大于Sum,则 j = j – 1。这样只需要在排好序的数组上遍
历一次,就可以得到最后的结果
,时间复杂度为O(N)。两步加起来总的时间复杂
度O(N*log2N),下面这个程序就利用了这个思想,代码如下所示:

for (i = 0,j=n-1; i < n; i++)
{if (arr[i] + arr[j] == num){return (i, j);}else{if (arr[i] + arr[j] < sum){i++;}else{j--;}}
}

快速寻找满足条件的两个数相关推荐

  1. 编程之美2.12 快速寻找满足条件的两个数

      这道题目的意思是,在一个数组中寻找两个数,使这两个数的和等于给定的数(找到任意一组就可以了).       题目读完之后,感觉这道题目还是很简单的,就是遍历数组呗,走两遍,即可以在O(n2)时间复 ...

  2. 第2章 数字之魅——快速寻找满足条件的两个数

    快速寻找满足条件的两个数 问题描述 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在这样一组或以上符合要求的解. 分析与解法 [解法一] ...

  3. python 多条件 选择 算法_python部署python算法 - 快速寻找满足条件的两个数

    题目前提是一定存在这样两个数 解法一就不写了...一般想不到吧 一开始想到的是解法二最后的用hash表 (其实是想到创建一个跟target一样大的数组啦..存在就写入index,但是要全部找出,那得二 ...

  4. python同时满足两个条件_python算法-快速寻找满足条件的两个数

    题目前提是一定存在这样两个数 解法一就不写了...一般想不到吧 一开始想到的是解法二最后的用hash表 (其实是想到创建一个跟target一样大的数组啦..存在就写入index,但是要全部找出,那得二 ...

  5. 程序员面试100题之十:快速寻找满足条件的两个数

    能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定S ...

  6. 【编程之美】2.12快速寻找满足条件的两个数

    给一个数组,找出其中一对和为sum的数字. 由于已经做过排好序的数组,找和为sum的题目.所以完全没有过多考虑就排了序,左右指针相互收缩着寻找. 跟答案上的方法也是一样的. /* start time ...

  7. 编程之美-快速寻找满足条件的两个数方法整理

    [问题描述] 方法一:时间复杂度O(n^2) 方法二:时间复杂度O(n),空间复杂度O(n) 方法三:时间复杂度O(nlogn)

  8. 小小c#算法题 - 1 - 找出数组中满足条件的两个数

    把一些东西放到网上,看的时候方便一些.代码可能有bug且不是最佳解决方案,仅供参考. 题目:输入一个按升序排序的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 ...

  9. 寻找20以内某两个数相除,其结果离黄金分割点0.618最近

    题目: 寻找某两个数相除,其结果 离黄金分割点 0.618最近: 要求:1)分母和分子不能同时为偶数 2)分母和分子 取值范围在[1-20] 分析:可采用嵌套for循环,分别遍历分子和分母,求出相除结 ...

最新文章

  1. java-第十三章-类的无参方法(一)-实现客户姓名的添加和显示
  2. 697. Degree of an Array 频率最高元素的最小覆盖子数组
  3. 深度卷积神经网络CNNs的多GPU并行框架 及其在图像识别的应用
  4. python文件和目录操作方法
  5. 10 大方法,让您的客服中心提供更出色的服务
  6. Photoshop Blendmodi in GLSL
  7. 用定时器控制灯的闪烁梯形图_用西门子PLC设计灯的闪烁的梯形图,就只要梯形图。...
  8. PDF N-Up Maker:一个把PDF转成小册子或者把多个页面放到一个页面上的工具(免费,免Acrobat,命令行模式)...
  9. idea看更改过的代码_就是你把所有代码全写在一个类里的?
  10. 服务器设置浏览器是否缓存
  11. 数据分析 线性回归分析 方差分析表
  12. html5qq空间代码作业,免费QQ空间背景代码大全(高手整理)
  13. 如何编辑微信文章(微信文章导出word)
  14. TTT培训,关于培训师的培训
  15. iOS冰与火之歌 – Objective-C Pwn and iOS arm64 ROP
  16. 幼儿园教师计算机心得,幼儿园教师信息技术应用心得体会
  17. vmware最小化安装
  18. segment的理解
  19. 计算机组成原理与体系结构——层次化存储结构
  20. 微信小程序蓝牙ibeacon_微信小程序iBeacon测距及稳定程序的实现解析

热门文章

  1. PowerEdge R730安装Windows server2008 R2操作系统
  2. 【Python基础】字符编码ASCII-GBK-Unicode-UTF-8之间的关系
  3. 10.23 相对,绝对路径,cd,mkdir/rmdir,rm命令
  4. What every programmer should know about memory 笔记
  5. 京东自建数据中心核心技术解密——运营管理篇
  6. Android 为什么要有handler机制?handler机制的原理
  7. 网站微信登录授权 ASP.NET
  8. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)
  9. Mysql数据库常用操作整理
  10. Android 打开屏幕旋转