同样是回溯算法,相比于前两道题
77. 组合(回溯)
17. 电话号码的字母组合(回溯)
这道题中,对于回溯遍历的内容可以使用一个boolean
数组来进行标记判断
class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> ans = new ArrayList<>();int n = nums.length;boolean[] visited = new boolean[n]; dfs(nums, n, visited, ans, new ArrayList<>());return ans;}public void dfs(int[] nums, int n, boolean[] visited, List<List<Integer>> ans, List<Integer> list) {if (list.size() == n) ans.add(new ArrayList<>(list));else {for (int i = 0; i < n; ++i) {if (!visited[i]) {int cur = nums[i];list.add(cur);visited[i] = true;dfs(nums, n, visited, ans, list);visited[i] = false;list.remove(list.size() - 1);} }}}
}
特别注意:
-
if
条件判断的位置for (int i = 0; i < n; ++i) {if (!visited[i]) {
不要写成
for (int i = 0; i < n && !visited[i]; ++i) {
会出错,但不明白为什么。
-
深度优先搜索时,回溯重置操作中去除的元素应该是
list
列表的最后一个元素,而不是n-1
list.remove(list.size() - 1);
而不是
list.remove(n - 1);