思路:先排序(升序),一是为了满足题目要求非降序,而是为了使用双指针。
1.一层循环+双指针。

public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res=new ArrayList<>();//用于返回
        //如果数组长度小于3,直接返回空的res。
        if(num.length<3){
            return res;
        }
        //对sum排序
        Arrays.sort(num);
        for(int i=0;i<num.length-2;i++){
            int l=i+1;//左指针
            int r=num.length-1;//右指针
            while(l<r){
                if(num[i]+num[l]+num[r]==0){//判断若满足条件
                    ArrayList tmp=new ArrayList<>();
                    tmp.add(num[i]);
                    tmp.add(num[l]);
                    tmp.add(num[r]);
                    if(!res.contains(tmp))//判断若列表中不存在此列表
                        res.add(tmp);//加入到res
                    //寻找下一个以num[i]作为第一个数值的符合条件结果
                    l++;
                    r=num.length-1;
                }else if(num[i]+num[l]+num[r]>0){//若大于0,则指针前移
                    r--;
                }else{//若小于0,指针后移
                    l++;
                }
            }
        }
        return res;//返回结果
    }