题意:给出一个序列,求出这个序列里所有不重复的三元组{a,b,c},使得a+b+c=0。
思路:首先的想法是固定一个元素a,求剩下元素的和为-a的所有b,c组合。为了避免重复,排一次序,每次固定最小的元素,且每次固定的元素不重复,这样就可以用之前2 sum那道题的哈希做法了,时间复杂度为O(n^2),代码运行时间大约为110ms。
有没有更好的做法呢,可以注意到,之前我们已经排过一次序,那么问题转化为了在一个有序的序列上判断是否有两个元素的和等于一个给定的值。
解决这个问题的方法是尺取法,具体来说,就是取两个指针,一个指向序列头,一个指向序列尾,如果当前头尾指针指向的元素和大于给定值,那么尾指针向前移动一步,如果当前头尾指针指向的元素和小于给定值,那么头指针向后移动一步。如果与给定值相等,那么头尾指针各移动一步,为了防止重复,还要跳过与先前所指元素相等的元素。