一个非常典型的回溯算法案例。
回溯算法本质是对一个决策树的遍历,对于本题,进入下一层决策树的条件是往链表里添加一个数字,每个节点的下一层决策树的节点数为数组中剩余的数字个数,因此对于每个节点,都要遍历数组中剩余的数字个数。
class Solution {
List<List<Integer>> res = new LinkedList<>();
List<List<Integer>> permute(int[] nums) {
// 记录「路径」
LinkedList<Integer> track = new LinkedList<>();
backtrack(nums, track);
return res;
}
void backtrack(int[] nums, LinkedList<Integer> track) {
// 触发结束条件
if (track.size() == nums.length) {
res.add(new LinkedList(track));
return;
}
for (int i = 0; i < nums.length; i++) {
// 排除不合法的选择
if (track.contains(nums[i]))
continue;
// 做选择
track.add(nums[i]);
// 进入下一层决策树
backtrack(nums, track);
// 取消选择
track.removeLast();
}
}
}