'''
解题思路:
首先排序;
第一个数字i遍历整个数组从0~len-2,若num[i]>0提前退出
然后定义双指针j,k一前一后,判断三个值的和与0的大小关系,
若等于0,j前移,k后移,判断无重复加入结束数组
若小于0,j前移,
若大于0,k后移
'''
# @param num int整型一维数组 
# @return int整型二维数组
#
class Solution:
    def threeSum(self , num ):
        # write code here
        n = len(num)
        if n<3:
            return []

        num = sorted(num)
        #print('num=',num)
        res = []
        for i in range(n-2):
            if num[i]>0:
                break
            j = i+1
            k = n-1            
            while j<k:
                if num[i]+num[j]+num[k]==0:
                    t = [num[i],num[j],num[k]]
                    if t not in res:
                        res.append(t)
                    j += 1
                    k -= 1
                elif num[i]+num[j]+num[k]<0:
                    j += 1
                elif num[i]+num[j]+num[k]>0:
                    k -= 1  
        #print('res=',res)
        return res

Solution().threeSum([-10,0,0,0,0,10,10,10,20,-10,-10,10,-10,-40]) # [[-10, -10, 20], [-10, 0, 10], [0, 0, 0]]