028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

47.全排列II-创新互联

关上过去和未来的铁门,活在“今天”这个舱室中。                                ——《人性的优点》

创新互联公司 - 服务器机柜租用,四川服务器租用,成都服务器租用,四川网通托管,绵阳服务器托管,德阳服务器托管,遂宁服务器托管,绵阳服务器托管,四川云主机,成都云主机,西南云主机,服务器机柜租用,西南服务器托管,四川/成都大带宽,大带宽服务器,四川老牌IDC服务商
47. 全排列 II

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

示例 1:

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

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

1<= nums.length<= 8
-10<= nums[i]<= 10

思路:(回溯)

此题是 46. 全排列 的进阶

判断的时候加上:

if(i >0 && nums[i] == nums[i-1] && hasVisited[i-1] == false) {
	continue;
}

其中最为关键的是 hasVisited[i-1] == false ,用来去重,就是限制一下两个相邻的重复的访问顺序

举个栗子 :

对于两个相同的数 1 1 ,我们将其命名为 a b,a 表示第一个 1 ,b 表示第二个 1

举另个栗子 :

去重最为关键的代码为:

if(i >0 && nums[i] == nums[i-1] && hasVisited[i-1] == false) {
	continue;
}

但如果改成 hasVisited[i-1] == true ,也是正确的, 去重代码如下:

if(i >0 && nums[i] == nums[i-1] && hasVisited[i-1] == true) {
	continue;
}

这是为什么呢?

(借用一下别人的图进行理解):

如果 是三个相同的数 1 1 1

树层上去重(hasVisited[i-1] == false),树形结构如下:
在这里插入图片描述
树枝上去重(hasVisited[i-1] == true),树形结构如下:
在这里插入图片描述
观察上图可以得出:

代码:(Java)
import java.util.ArrayList;
import java.util.List;

public class all_permute {public static void main(String[] args) {// TODO 自动生成的方法存根
		int [] nums = {1, 1, 2};
		System.out.println(permuteUnique(nums));
	}
	public static List>permuteUnique(int[] nums) {List>permutes = new ArrayList<>();
		Listpermute = new ArrayList<>();
		if(nums == null || nums.length == 0) {	return permutes;
		}
		int flag = 0;//标记
		for(int i = 1; i< nums.length ; i++) {//冒泡排序
			for(int j = 0; j< nums.length - i; j++) {		if(nums[j] >nums[j+1]) {int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
					flag++;
				}
			}
			if(flag == 0)
				break;
		}
		boolean [] hasVisited = new boolean[nums.length];
		backTracking(nums, hasVisited, permute, permutes);
		return permutes;
	}
	private static void backTracking(int[] nums, boolean[] hasVisited, Listpermute, List>permutes) {// TODO 自动生成的方法存根
		if(permute.size() == hasVisited.length) {	permutes.add(new ArrayList<>(permute));
			return;
		}
		for(int i = 0; i< nums.length; i++) {	if(hasVisited[i]) {		continue;
			}
			if(i >0 && nums[i] == nums[i-1] && hasVisited[i-1] == false) {		continue;
			}
			hasVisited[i] = true;
			permute.add(nums[i]);
			backTracking(nums, hasVisited, permute, permutes);
			permute.remove(permute.size() - 1);
			hasVisited[i] = false;
		}
	}
}
运行结果:

在这里插入图片描述

复杂度分析:注:仅供学习参考!

题目来源:力扣

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文名称:47.全排列II-创新互联
本文来源:http://www.tsicrk.com/article/geepg.html

其他资讯

让你的专属顾问为你服务

2.2226s