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

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值