全排列

博客围绕给定可含重复数字的序列求所有不重复全排列展开。给出样例输入 [1,1,2] 及对应输出,分析求解方法,先对序列排序让重复数字相邻,采用深度搜索,用标志数组标记数字是否放置,一次排列结束后交换数字位置。

题目描述:

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

样例:

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

分析:

因为可能包含重复的数字,所有首先对序列排序,使得重复的数字相邻。
这是一个深度搜索的过程。想象每个盒子只能放一个数字,当一个盒子的数字确定之后,排列方式就等于其他数字的放置。当一次排列结束以后,交换数字的放置位置。
设置标志数组flag,flag[i]=false表示第i个数字还未被放置。

//执行用时 : 5 ms, 在Permutations II的Java提交中击败了87.93% 的用户
//内存消耗 : 42.7 MB, 在Permutations II的Java提交中击败了77.57% 的用户
	 public List<List<Integer>> permuteUnique(int[] nums) {
		 List<List<Integer>> list=new ArrayList<>();
		 if(nums==null)
			 return list;
		 List<Integer> l=new ArrayList<>();
		 boolean []flag=new boolean[nums.length];
		 Arrays.sort(nums);
		 dfs(nums,l,flag,list);
		 return list;
	 }
	private void dfs(int[] nums, List<Integer> l, boolean[] flag, List<List<Integer>> list) {
		if(l.size()==nums.length) {
			list.add(new ArrayList<>(l));
			return;
		}
		for(int i=0;i<nums.length;i++) {
			if(flag[i]==true||i>0&&nums[i]==nums[i-1]&&flag[i-1]==false)
				continue;
			l.add(nums[i]);
			flag[i]=true;//第i个数字已经被放置
			dfs(nums,l,flag,list);
			flag[i]=false;//第i个数字未被排列
			l.remove(l.size()-1);
			
		}
	}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值