题目
分析
给定一个列数字,求这列数字中的三元组$(a_i,a_j,a_k)$满足下面两个条件
- $a_i\leq a_j\leq a_k$
- $a_i+a_j+a_k=0$
注意:重复的只算一次
思路
先排序
三个元素和为0,那么一定有两个元素大于等于0,一个小于0;或者两个小于等于0,一个大于0。总之不能三个元素都同号
设三个指针,low从前往后扫描,high从后往前扫描,mid在这两个指针中间从前往后扫描:
先固定low指针,从前往后扫描,知道元素值>=0时停止
- 当三个指针指向的元素和为0时,记录下来。
- 当三个指针指向的元素和>0时,high向前移动。
- 当三个指针指向的元素和<0时,mid向后移动。
需要注意的地方:
- 同一个指针扫过的相等的元素只计算第一次,后面的要略过
- 元素值的平方已经超过int的最大位数,要用long long型
代码
|