Given a collection of distinct integers, return all possible
permutations.Example:code
Input: [1,2,3]
Output: [
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1] ]排序
回溯法, 这里由于每次要从i= 0开始遍历(若是还继续用i = index, 就只会有[1,2,3] 而[2,1,1],[3,2,1]的状况就会错过)
因此要维护一个列表, 确认每一个数是否被访问过rem
时间O(n!) 空间O(n)it
class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<>(); if (nums == null || nums.length == 0) { return res; } List<Integer> tmp = new ArrayList<>(); boolean[] visit = new boolean[nums.length]; dfs(nums, tmp, res, visit); return res; } private void dfs(int[] nums, List<Integer> tmp, List<List<Integer>> res, boolean[] visit) { if (tmp.size() == nums.length) { res.add(new ArrayList<>(tmp)); return; } for (int i =0; i < nums.length; i++) { if (visit[i]) { continue; } tmp.add(nums[i]); visit[i] = true; dfs(nums, tmp, res, visit); tmp.remove(tmp.size() - 1); visit[i] = false; } } }
这里由于会有重复状况, 因此要先排序 而后确认当前数和前一个数相同且前一个数没有被访问的状况下跳过.io
时间O(n!) 空间O(n)class
class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> res = new ArrayList<>(); if (nums == null || nums.length == 0) { return res; } Arrays.sort(nums); List<Integer> tmp = new ArrayList<>(); boolean[] visit = new boolean[nums.length]; dfs(nums, tmp, res, visit); return res; } private void dfs(int[] nums, List<Integer> tmp, List<List<Integer>> res, boolean[] visit) { if (tmp.size() == nums.length) { res.add(new ArrayList<>(tmp)); return; } for (int i =0; i < nums.length; i++) { if (visit[i]) { continue; } if (i != 0 && nums[i] == nums[i-1] && visit[i-1] == false) { continue; } tmp.add(nums[i]); visit[i] = true; dfs(nums, tmp, res, visit); tmp.remove(tmp.size() - 1); visit[i] = false; } } }