题目链接
思路:
回溯算法。
由于要求的是全排列,那么就需要以每一个元素为开头去寻找接下来的排列,确定第一个元素后,再以剩余每一个元素为第二个元素去寻找接下来的排列,依次类推,寻找过程中,为了避免重复,需要记录当前元素是否已经在前面排列中使用过。
代码如下,已注释好。
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
if (nums == null || nums.length == 0) {
return ans;
}
// 使用一个布尔数组来记录元素是否使用过
boolean[] used = new boolean[nums.length];
dfs(nums, used, new ArrayList<Integer>(), ans);
return ans;
}
private void dfs(int[] nums, boolean[] used, List<Integer> list, List<List<Integer>> ans) {
// 当前排列的列表的大小等于数组大小时,说明当前列表为答案之一,添加进答案中
if (list.size() == nums.length) {
ans.add(new ArrayList<Integer>(list));
return;
}
for (int i = 0; i < nums.length; i++) {
// 若当前元素没有使用过
if (!used[i]) {
used[i] = true; // 使用它,并标记为使用过
list.add(nums[i]); // 当前列表中加入当前元素
// 以当前列表以及当前布尔数组为基础,开始寻找下一个元素
dfs(nums, used, list, ans);
// 上面寻找结束之后,需要将之前添加进去的元素删除掉,
// 代表以该元素为特定位置的排列已经全部寻找完毕
list.remove(list.size() - 1);
used[i] = false; // 将当前元素标识为未使用过
}
}
}