算法练习

全排列 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; //状态重置
        }
上一篇 下一篇

猜你喜欢

热点阅读