liuxuhelloworld's notebook

题目链接

https://leetcode-cn.com/problems/permutations-ii/

解答过程

这个题目是Problem46的进阶版,在Problem46中,限定入参数组是不包含重复元素的,这样就不需要关心重复解问题。Problem47允许入参数组包含重复元素,那么单纯地像Problem46那样做回溯处理就不行了,需要在回溯的过程中避免重复解。如何避免重复解,我应该是挺久以前参考官方题解写的。简单来说,对于重复值元素,确保他们是从左到右按顺序被选中进入permutation就可以避免重复解。另外,对于Problem46中不使用标记数组的写法,我尝试了下,没写出来,感觉不适用于那种写法不适用于Problem47,有时间再研究下。

	public List<List<Integer>> permuteUnique(int[] nums) {
		List<List<Integer>> result = new ArrayList<>();

		List<Integer> permutation = new ArrayList<>();

		boolean[] tag = new boolean[nums.length];

		Arrays.sort(nums);

		backtrack(result, permutation, nums, tag, 0);

		return result;
	}

	private void backtrack(List<List<Integer>> result, List<Integer> permutation, int[] nums, boolean[] tag, int cur) {
		if (cur == nums.length) {
			result.add(new ArrayList<>(permutation));
			return;
		}

		for (int i = 0; i < nums.length; i++) {
			if (tag[i] == true
				|| (i > 0 && nums[i] == nums[i-1] && !tag[i-1])) {
				continue;
			}

			tag[i] = true;
			permutation.add(nums[i]);
			backtrack(result, permutation, nums, tag, cur+1);
			permutation.remove(permutation.size()-1);
			tag[i] = false;
		}
	}