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; } } }
回溯算法,求解