全排列,出了名的回溯法解决。不多说了,直接上代码吧:
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new LinkedList<>();
int[] flag = new int[nums.length];
helper(result, flag, nums, new ArrayList<>(), 0);
return result;
}
/**
*
* @param result 结果集,引用传递
* @param flag 访问标志
* @param nums 原始数组
* @param parent 上一层传下来的结果
* @param layer 当前处在第几层
*/
private void helper(List<List<Integer>> result, int[] flag, int[] nums, List<Integer> parent, int layer) {
if (layer == nums.length) { //如果当前层已经到最后了,将上一层的结果加到结果集中
result.add(parent);
return;
}
for (int i = 0; i < nums.length; ++i) { //遍历数组
if (flag[i] == 0) { //这个元素还没访问过
List<Integer> curList = new ArrayList<>(parent); //获得上一层新数组,并加上当前未访问的元素
curList.add(nums[i]);
int[] newFlag = Arrays.copyOf(flag, flag.length); //获得上一层访问标志,并更新当前层的访问标志
newFlag[i] = 1;
helper(result, newFlag, nums, curList, layer+1); //传递到下一层
}
}
}
}