博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美2.12快速寻找满足条件的2个数
阅读量:4636 次
发布时间:2019-06-09

本文共 939 字,大约阅读时间需要 3 分钟。

题目:

对于一个数组,快速找出两个数字,让这两个数字的和等于一个给定的值,默认假设数组中肯定有至少一组符合要求。

数组a[]={5,6,1,4,7,8,9},sum=10.

解法一:

穷举,遍历数组中所有的2个数字,相加之和看是否等于给定的数字,时间复杂度为N(N-1)/2,既O(N^2),这种方法效率不高。

1 #include "iostream" 2 using namespace std; 3  4 void sum(int *a,int N){ 5     for(int i=0;i

解法二:

求2个数字之和,假定和为sum,对于元素a[i]只需判断数组中是否存在sum-a[i],无序数组中查找一个数的时间复杂度为O(n),不对数组进行操作的时间复杂度仍为O(n^2)。如果对数组进行排序,然后才去二分查找的方法,查找一个元素的时间复杂度为O(log2n),总时间复杂度为O(n*log2n)。而排序的过程只需要进行一次,时间复杂度为O(N*log2n),所以总时间复杂度仍为O(n*log2n)。

解法三:

换个角度,对于有序序列,从两头分别取数,之和大于sum,j--,之和大于sumi++。将排序号的数组遍历一遍即可输出全部的结果。

1 #include "iostream" 2 #include "algorithm" 3 using namespace std; 4  5 void sum(int *a,int N){ 6 int i,j; 7     for(i = 0,j = N-1;i

 

扩展问题:

1,将两个数字改为3个数字。

假设找到了3个数ai,aj,ak,ai+aj+ak=sum,既ai+aj=sum-ak。i,k从左侧遍历,j从右侧遍历。以sum=17为例,会输出三组满足条件的数。

1 #include "iostream" 2 #include "algorithm" 3 using namespace std; 4  5 void sum(int *a,int N){ 6 int i,j,k; 7 for(k=0;k

 

转载于:https://www.cnblogs.com/SeekHit/p/5198472.html

你可能感兴趣的文章
网络流24题-飞行员配对方案问题
查看>>
Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
查看>>
Excel的数据分析—排位与百分比
查看>>
讯飞语音识别Android-Demo
查看>>
引入css的四种方式
查看>>
Mysql蠕虫复制
查看>>
centos7+ansible自动化工具使用
查看>>
iOS开发UI篇—transframe属性(形变)
查看>>
3月7日 ArrayList集合
查看>>
正则替换
查看>>
jsp 环境配置记录
查看>>
本地视频播放黑屏,有声音
查看>>
Python3-Cookbook总结 - 第一章:数据结构和算法
查看>>
Python03
查看>>
LOJ 2537 「PKUWC2018」Minimax
查看>>
使用java中replaceAll方法替换字符串中的反斜杠
查看>>
Android初学第36天
查看>>
Some configure
查看>>
.net core 中的[FromBody]
查看>>
json_encode时中文编码转正常状态
查看>>