算法导论 第三版 2.3-7
前一阵,看了不少2-SUM 3-SUM 之类的问题,然后回头偶然发现,其实《算法导论》第三版 2.3-7就是著名的2-SUM问题啊。好吧,蓦然回首它却在灯火阑珊处。
我们将在本文看到,如何
从 2-SUM问题 拓展到3-SUM 拓展到4-SUM 问题,之后拓展到a^3 + b^3 + c^3 = d^3这种诡异的等式。最后我们将去看一个更加2b的问题。
我们下面都不考虑负数的情况!!!
2-SUM
2-sum问题大概就是,给你一堆数,然后问里面有没有两个数的和是一个给定的数。
比如,给你[1,7, 5, 8, 11, 15, 12], 问里面有没有两个数的和是 8,结果自然是有了,,但如果问里面有没有两个数是10,结果自然是没有。
2-sum问题比较简单,直接排序
变成[1,5,7,8,11,12,15],然后,比如目标和是 8,那么固定一个数是1,就去找里面有没有一个数是7,1+7 = 8,如果有7,那么就成功,如果不行,就固定,5,然后再去找3。
等等,找的时候可以用2分查找,比较简单,时间复杂度就是 logn,然后n个数,nlogn,然后排序也是nlogn,总的时间复杂度就是 nlogn
可以优雅一点,不用那么多次2分查找。如果里面有一对数的和是22 , 那么肯定有一个大于等于11大,另一个小于等于11。 然后,我们先用二分查找固定11,
假定,较大的数和较小的数都是11,当然本题不行,
那么就然较大的数取12,然后12+11>22偏大
,那么就让较小的数调整到11的左边,8,然后8+12<22,
然后就让较大的数调整到15,然后15+8 >23,
那么就再让小的数往左边走,这样,8的左边是7,7+15 = 22满足了。
虽然时间复杂度仍然是nlogn,但会优雅一点。也为下面的3-sum提供了优化思路。