您的位置:首页 > 其它

算法理解——寻找和为定值的两个数/多个数

2013-09-26 15:52 134 查看
1 寻找和为定值的两个数

题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
example: 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

思路1: 若数组无序,首先用快排排序O(n*log n)
然后从头遍历每个数,对其互补的数用二分查找,因为二分查找的时间复杂度是O(log n),所以总的时间复杂度也就是O(n*log n)

思路2 :构造hash表的思想,hash查找的特点:可以快速查找到给定的数字是否在表中,以及在表中的位置。
当构造好hash表后,查找其互补的数字的时间复杂度就不是O(n),而是O(1)了
缺点:构造hash额外增加了O(N)的空间

思路3(可能是最优思路):
排序后得到的原始序列:1、 2、 4、 7、11、15 用输入数字15减一下各个数,得到对应的序列为:

对应序列:14、13、11、8、4、 0

要达到O(N)的复杂度,第一个数组以一指针i 从数组最左端开始向右扫描,第二个数组以一指针j 从数组最右端开始向左扫描,首先初始i指向元素1,j指向元素0,谁指的元素小,谁先移动,由于1(i)>0(j),所以i不动,j向左移动。然后j移动到元素4发现大于元素1,故而停止移动j,开始移动i,直到i指向4,这时,i指向的元素与j指向的元素相等,故而判断4是满足条件的第一个数;然后同时移动i,j再进行判断,直到它们到达边界

排序后,时间复杂度由二分查找的O(n*log n)降为O(n)

----------------------------------------------------------

2 寻找和为定值的多个数

编程求解:

输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,

使其和等于 m ,要求将其中所有的可能组合列出来。

这个问题就是典型的0,1背包问题了,设函数f(n,m)就是最终的结果,那么
f(n,m)无非由以下两种情况构成:
1.n包含在最优解中,即:放n,n-1个数填满sum-n f(n,m)= f(n-1,sum-n) 并 n
2.n不包含在最优解中,即:不放n, n-1个数填满sum f(n,m) = f(n-1, sum)

具体实现参考此贴:/article/1361454.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: