LeetCode——Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

  • Example:
    Input: [1,1,2]
    Output:
    [
    [1,1,2],
    [1,2,1],
    [2,1,1]
    ]

解法

这个题和前面一题有点类似,但是它允许数字重复,但输出的全排列中不可以有重复的组合,所以要改变一下Permutations里的代码

public List<List<Integer>> permuteUnique(int[] nums) {
		List<List<Integer>> res=new ArrayList<List<Integer>>();
		List<Integer> list=new ArrayList<Integer>();
		Arrays.sort(nums);
		boolean[] visited=new boolean[nums.length];
		permutedfs(nums,visited,list,res);
		return res;
    }

	private void permutedfs(int[] nums, boolean[] visited, List<Integer> list, List<List<Integer>> res) {
		// TODO Auto-generated method stub
		if(list.size()==nums.length)
		{
			res.add(new ArrayList<Integer>(list));
			return;
		}
		for(int j=0;j<nums.length;j++)
		{
			if(visited[j])
				continue;
			if ((j>0 && nums[j] == nums[j - 1])&&!visited[j-1])
				continue;
			visited[j]=true;
			list.add(nums[j]);
			permutedfs(nums, visited, list, res);
			list.remove(list.size()-1);
			visited[j]=false;
		}
	}

Runtime: 2 ms, faster than 100.00% of Java online submissions for Permutations II.
Memory Usage: 39.5 MB, less than 56.43% of Java online submissions for Permutations II.

if ((j>0 && nums[j] == nums[j - 1])&&!visited[j-1])

这条语句用于避免出现重复组合,如果nums[j]==nums[j-1]而visited[j-1]为false的话说明与nums[j]相等的上一个数字已经排列过了,再用它排列就会出现重复,因此要跳过这个数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值