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]);
    		    }    		   		 
    		}
    	}
    }
};
                    
                
                
            
        
浙公网安备 33010602011771号