leetcode46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
经典的回溯算法
遍历所有的可能性,用visited数组标记是否已经访问过,如果list的长度等于nums的长度,就说明所有的数都在里面了,要添加到最后的ans中。
回溯注意最后一步要恢复到刚进来dfs函数的状态,比如刚进来时候排列组合是 [1,2],现在添加了一个3,变为 [1,2,3] 。在回溯的时候还应该为 [1,2],应该把刚才遍历的情况删除掉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public List<List<Integer>> permute(int[] nums) { int[] visited = new int[nums.length]; int count = 1; for (int i = 0; i < nums.length; i++) { visited[i] = 1; list = new LinkedList<>(); list.add(nums[i]); dfs(nums, visited, count); visited[i] = 0; list.removeLast(); } return ans; } public LinkedList<List<Integer>> ans = new LinkedList<>(); public LinkedList<Integer> list = new LinkedList<>(); public void dfs(int[] nums, int[] visited, int count) { if (count == nums.length) { ans.add(new LinkedList<>(list)); return; } for (int i = 0; i < nums.length; i++) { if (visited[i] == 1) continue; visited[i] = 1; list.add(nums[i]); dfs(nums, visited, count + 1); visited[i] = 0; list.removeLast(); } } }
|
leetcode 87/100