47. 全排列 II

题目描述

给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[ [1,1,2], [1,2,1], [2,1,1] ]

思路

相当于找出所有不同的num.size()元组来,我们只需要保证设计程序时,对于这个元组每个位置的可能情况枚举时,每次做到不重复,才能之后再继续递归下去。

代码

class Solution {
public:
    vector<vector<int> > permuteUnique(vector<int> &num) 
    {

    	vector<vector<int>> ret;
    	int size = num.size();
    	if(size == 0)
    		return ret;
    	permuteUniqueCore(num,0,ret);
    	return ret;           
    }
    //判断cur位置处的元素如果放置在begin处,是否是首次出现,如果以前出现过,则
    //返回false
    bool check(vector<int>&num,int begin,int cur)
    {
        for(int pre = begin;pre < cur;pre++)
        {
            if(num[cur] == num[pre]) 
                return false;
        }
        return true;
    }

    void permuteUniqueCore(vector<int> &num,int index,vector<vector<int>> &ret)
    {
    	if(index == num.size())
    	{
    		ret.push_back(num);
    		return;
    	}
    	else
    	{   
    		for(int i = index;i < num.size();i++)
    		{   
    			if(i == index)
                    permuteUniqueCore(num,index+1,ret);
    			else if(check(num,index,i)) 
    			{                                       
    				swap(num[index],num[i]);                             
    			    permuteUniqueCore(num,index+1,ret);   
    			    swap(num[index],num[i]);
    		    }    		   		 
    		}
    	}
    }
};

posted on 2021-05-03 10:58  朴素贝叶斯  阅读(28)  评论(0编辑  收藏  举报

导航