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

京公网安备 11010502036488号