全排列 II(LeetCode 47,46的升级版)
2020-02-22 本文已影响0人
倚剑赏雪
题目
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解析
1.步骤基本和46题类似
2.在当前数和前一位相等时,判断前一位是否被使用,未被使用则直接下一步
代码
public IList<IList<int>> PermuteUnique(int[] nums) {
Array.Sort(nums);
IList<IList<int>> res = new List<IList<int>>();
int[] tempArr = new int[nums.Length];
bool[] vis = new bool[nums.Length];
BackTrackPermute(0,nums.Length,nums,vis,res,tempArr);
return res;
}
void BackTrackPermute(int cur,int len,int[] nums, bool[] vis,IList<IList<int>> res,int[] tempArr)
{
if (cur == len)
{
res.Add(new List<int>(tempArr));
return;
}
for (int i = 0; i < len; i++)
{
if(vis[i]) continue;//如果已经使用则继续
if(i>0 &&nums[i] == nums[i-1]&&!vis[i-1]) continue;
Console.WriteLine(cur);
vis[i] = true;
tempArr[cur] = nums[i];//把当前的cur的值赋为nums[i]的值
BackTrackPermute(cur+1,len,nums,vis,res,tempArr);//继续
vis[i] = false; //状态重置
}