import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型二维数组
     */
    ArrayList<int[]> list = new ArrayList<>();
    ArrayList<Integer> path = new ArrayList<>();
    boolean[] used ;
    int sum = 0;
    public int[][] findTriplets (int[] nums) {
        Arrays.sort(nums);
        used = new boolean[nums.length];
        back(nums,0);
        //回溯算法,元素可以重复,但是不可复选
        return list.toArray(new int[list.size()][3]);
    }
    void back(int[] nums,int idx){
        if (path.size()==3&&sum==0) {
            list.add(new int[]{path.get(0),path.get(1),path.get(2)});
            return;
        }
        if (sum>0) {
            return;
        }
        for (int i = idx; i < nums.length; i++) {
            int num = nums[i];
            if (used[i] || (i>0&&nums[i-1]==nums[i]&&!used[i-1])) {
                continue;//如果是使用过的,或者当前和上一个元素相等,并且没使用过上一个
            }
            if (sum>0) {
                return;//
            }
            sum+=num;
            path.add(num);
            used[i]=true;
            back(nums, i+1);
            path.remove(path.size()-1);
            used[i]=false;
            sum-=num;
        }

    }
}


回溯算法,求解