寻找和为定值的两个数
来源:互联网 发布:matlab矩阵归一化函数 编辑:程序博客网 时间:2024/05/21 12:45
描述:
输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(N)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
分析:
如果采取穷举,复杂度为O(N^2),可以换一个思路,题目相当于对每个a[i],查找sum-a[i]是否也在原始序列中,每一次要查找的时间都要花费为O(N),假如采用二分查找,时间复杂度可以提高到O(Nlog N)。
如何将时间复杂度降为O(N)呢?
如果数组是无序的,先排序(N log N),然后用两个指针i,j,各自指向数组的首尾两端,令i=0,j=n-1,然后i++,j–,逐次判断a[i]+a[j]是否等于sum。所以,数组无序的时候,时间复杂度最终为O(N log N + N)=O(N log N)。如果原数组是有序的,则不需要事先的排序,直接用两指针分别从头和尾向中间扫描,时间复杂度为O(N),且空间复杂度还是O(1)。
下面是此思路(这里假定数组已经是有序的)的python实现:
def twoSum(str,n): head=0 tail=len(str)-1 for i in range(len(str)): if str[head]+str[tail]==n: print str[head],str[tail] break elif str[head]+str[tail]>n: tail-=1 else: head+=1
总结:
要想达到时间O(N),空间O(1)的目标,除非原数组是有序的(指针扫描法),不然,当数组无序的话,就只能先排序,后指针扫描法或二分(时间 O(Nlog N),空间O(1)),或映射或hash(时间O(N),空间O(N))。时间或空间,必须牺牲一个以达到平衡。
0 0
- 寻找两个数的和为定值的算法
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找满足和为定值的两个数
- 寻找和为定值的两个数/多个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 【算法】寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 数组------寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 利用jquery实现的表格冻结列(固定列)功能
- 如何避免历史回退到登录页面
- reverse a linked list
- MFC 关于SendMessage 消息参数 传送字符串,结构体
- URI,URL,URN的区别
- 寻找和为定值的两个数
- MFC控件(10): Date Time Picker-使用及日期运算
- ZZNU 1991 (结构体排序)
- Hbase 0.96后Result对象遍历方式
- MongoDB 安装以及使用
- 内联函数与宏的区别
- 124.leetcode Binary Tree Maximum Path Sum(hard)[先序遍历]
- 自己动手实现优先级队列
- Console命令详解,让调试js代码变得更简单