2.3-7

来源:互联网 发布:python 防止sql注入 编辑:程序博客网 时间:2024/06/10 02:31

不考虑hash算法
代码戳这里

算法如下:
1.先对数组A从小到大排序
2.令left为0,right为n-1(n为A长度)
3.若left == right 返回失败,否则检查A[left]+A[right]是否等于x,若等于则返回成功,否则若小于x,则left++,若大于x,则right–,然后重复步骤3

证明:
若本身无解,算法显然会返回失败

若有解,我们总能找到一组解(a,b),b-a是所有解中最大的。
我们考察步骤3的每一次执行时的left和right,我们用数学归纳法来证明第k次执行步骤3时总有left≤a与right≥b成立
k=1时,显然成立
k=t时,假设成立
k=t+1时,若left>a,在第t步时,必有left==a,我们将left加1。第t步时,right≥b,若right==b,则不会执行t+1步;若right>b,则此时A[left]+A[right]>x,不可能去执行left加1操作,故left≤a;同理,我们可以证明right≥b。
故由数学归纳法,每次执行步骤3时总有left≤a与right≥b成立
由于每一次执行步骤3,如果不返回成功(由于讨论有解情况,所以a<b),则每一次必然有left加1或right减1,而迭代的步骤是有最大限制的,故总终一定在left=a,right=b时结束
这样,我们就能找到解(a,b)

0 0
原创粉丝点击