在给定的序列中寻找两数之和为定值m的情况--对算法复杂度的分析与优化
来源:互联网 发布:cfd软件百花齐放论文 编辑:程序博客网 时间:2024/06/05 06:14
问题:输入n(n<=100,000)个整数,找出其中的两个数,使这两个数之和等于m。题目保证肯定有解。给出的数均为int型。
方法一:
题目就是为了找两个数之和为m的情况,那我们可以用两重循环,枚举所有的取数方法。
for(int i=0;i<n-1;++i){ for(int j=i+1;j<n-1;++j) if(a[i]+a[j]==m) break;}//这样就找到了i和j此方法时间复杂度为O(n^2). 且n^2约为100亿,算法性能太差。
方法二:
1) 将数组排序,时间复杂度O( n × log(n) )
2) 对排序后的数组中的每个元素a[i],在数组中二分查找m-a[i],看能否找到。复杂度O( n × log(n) )
sort(a,a+n);for(int i=0;i<n;++i){ if(BinarySearch(a,n,m-a[i])!=-1) break;}int BinarySearch(int a[],int cnt,int p){ int left=0,right=cnt-1; while(left<=right){ int mid=(left+right)/2; //为了防止(left+right)过大溢出,我们一般写成 int mid=left+(right-left)/2; if(p>a[mid]) left=mid+1; else if(p<a[mid]) right=mid-1; else return mid; } return -1;}
方法三:
1) 将数组排序,时间复杂度O( n × log(n) )
2) 设置两个变量,i和j,i初值为0,j初值为n-1。看a[i]+a[j],如果比m大,就让j-1;如果比m小,就让i+1;直到找到a[i]+a[j]=m
sort(a,a+n);int i=0,j=n-1;while(i<=j){ if(a[i]+a[j]<m) i++; else if(a[i]+a[j]>m) j--; else break;}
方法一时间复杂度最大是O(n^2),方法二和方法三时间复杂度都是O( n × log(n) )
在解决问题的时候要估算程序数据的数量级,不要总是用最笨的算法,稍微运用下相关的算法思想就能很大程度的改善算法性能。
阅读全文
0 0
- 在给定的序列中寻找两数之和为定值m的情况--对算法复杂度的分析与优化
- 快速寻找满足条件的两个数(两数之和为给定值)
- 在已排序的数组中寻找和是给定值的两项,要求时间复杂度为O(n)
- 如何在一个给定数组中找两个和为某个定值的数,要求时间复杂度为O(n)
- 寻找两个数的和为定值的算法
- 【算法】寻找和为定值的两个数
- 寻找数组中第k小的数:平均情况下时间复杂度为O(n)的快速选择算法
- 面试算法题:数组中两个数之和为定值,找出这对数的下标
- LeetCode 之 two Sum寻找两个相加之和为给定值的两个数
- 寻找和为定值的数
- 排好序的数组中,找出两数之和为m的所有组合
- 算法.给定数为数组中2个元素的之和,求出数组的下标
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- 寻找两数之和为某个值
- 【题目40】求整形数组中满足两数之和为sum的数值对
- 寻找和为定值的两个数
- PCL滤波II
- 用Eclipse搭建SSM+Maven+Shiro环境
- HDU 1171
- monkey-GUI代码编辑分享
- springMvc 如何通过注解@Value 读取配置文件中的内容(.properties)
- 在给定的序列中寻找两数之和为定值m的情况--对算法复杂度的分析与优化
- Linux du命令和df命令区别-转
- NYOJ 76 超级台阶 fibonacci数
- apk编译copy到out的处理
- ECharts中color : function的用法
- 米勒拉宾算法——素性测试
- Jenkins系统设置中设置邮件通知
- 使用My97DatePicker时间插件问题解决
- java编程中的路径问题