给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例 :
1 2 3 4 5 6 7
| 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
|
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
本题的思想就是回溯,也可以说是一种暴力破解方法。我们不断的在递归之前将未出现的元素添加到track数组,在递归之后从track数组剔除元素并尝试加入下一个元素,最终遍历完所有的情况
具体代码如下:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { List<List<Integer>> res = new LinkedList<>(); HashSet<List<Integer>> temRes = new HashSet<>();
public List<List<Integer>> permuteUnique(int[] nums) { LinkedList<Integer> track = new LinkedList<>(); boolean[] used = new boolean[nums.length]; backtrack(nums, track, used); for (List<Integer> temRe : temRes) { res.add(temRe); } return res; }
void backtrack(int[] nums, LinkedList<Integer> track, boolean[] used) { if (track.size() == nums.length) { temRes.add(new LinkedList<>(track)); return; }
for (int i = 0; i < nums.length; i++) { if (used[i]) { continue; } if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) { continue; } track.add(nums[i]); used[i] = true; backtrack(nums, track, used); used[i] = false; track.removeLast(); } } }
|