/* * 46. Permutations * 2016.5.5 by Mingyang 方法还是原来那个套路,还是用一个循环递归处理子问题。 * 区别是这里并不是一直往后推进的,前面的数有可能放到后面,所以我们需要维护一个visited数组来表示该元素是否已经在当前结果中, * 因为每次我们取一个元素放入结果,然后递归剩下的元素,所以不会出现重复 * 这道题还有一个扩展就是如果元素集合中会出现重复,那么意味着我们需要跳过一些重复元素 * 1.长度标准:无 * 2.可选的范围:任何一个都可以选!没有顺序 * 3.往前走一步:在未访问某一个的前提下,直接带入 * 4.后退一步:remove * 5.特别的case:size到了 * 6.关于重复:无 */ public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>(); boolean[] visited = new boolean[nums.length]; List<Integer> temp = new ArrayList<Integer>(); dfs3(nums, visited, temp, res); return res; } private void dfs3(int[] nums, boolean[] visited, List<Integer> temp,List<List<Integer>> res) { if (temp.size() == nums.length) { res.add(new ArrayList<Integer>(temp)); return; } for (int i = 0; i < nums.length; i++) { if (!visited[i]) { visited[i] = true; temp.add(nums[i]); dfs3(nums, visited, temp, res); temp.remove(temp.size() - 1); visited[i] = false; } } }