先排序,再双指针
和太小左指针动,和太大右指针动
最大的难点在于需要去重
PREP
三数之和的标准解法是排序加双指针,同时在三处做去重。
目标是 a+b+c=0,变形为 b+c = -a。
我们外层 for 循环固定第一个数 a,用双指针去找b 和 c;和偏小左指针右移,和偏大右指针左移;
通过 i 去重、找到解后 left 和 right 去重,避免输出一模一样的三元组。
i去重指的是如果当前a 和上一轮的a一样,跳过本轮;
找到解后的left去重指的是:找到答案之后,把left后面所有和b相同的全部跳过。防止同一个a下,相同的b再次配对,产出重复答案。
找到解后的right去重指的是:找到答案之后,把right前面所有和c相同的全部跳过
总的来说,把三层暴力 O (n³) 优化到 O (n²)。