leetcode刷题之旅(47)全排列2

题目描述

给定一个可包含重复数字的序列,返回所有不重复的全排列。

 

样例

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

思路分析

依旧是回溯法,不过要注意重复元素,加入flag标志数组判断

 

代码及结果

public List> permuteUnique(int[] nums) {
		List> list = new ArrayList>();
		List list1 = new ArrayList();
		boolean flag[] = new boolean[nums.length];
		Arrays.sort(nums);
		dfs(list, list1, nums, flag);;
		return list;
	}
void dfs(List> list, List list1, int[] nums, boolean[] flag){
		if (list1.size() == nums.length) {
			list.add(new ArrayList(list1));
		}
		else {
			for (int i = 0; i < flag.length; i++) {
				if (flag[i]) {
					continue;
				}
				if (i>0 && nums[i]==nums[i-1] && !flag[i-1]) {
					continue;
				}
				list1.add(nums[i]);
				flag[i] = true;
				dfs(list, list1, nums, flag);
				flag[i] = false;
				list1.remove(list1.size()-1);
			}
		}
	}

leetcode刷题之旅(47)全排列2_第1张图片

你可能感兴趣的:(刷题之LeetCode)