1. 先排序;
  2. 固定一个数字,然后从左右两边开始查找和为该数的负数即可。 alt

剪枝:

  • 因为是排序的,如果第一个数字大于0,那么后面的也都大于0,他们三个数字的和不可能等于0
  • 过滤掉重复的
if (i > 0 && num[i] == num[i - 1])  
      continue
  • 过滤掉重复的
while (left < right && num[left] == num[left + 1])
	left++;
while (left < right && num[right] == num[right - 1])
	right--;