16. 带重复元素的排列

提示

        LintCode中的相关算法题实现代码,可以在我的GitHub中下载。

题目需求

    给出一个具有重复数字的列表,找出列表所有不同的排列。

样例

      给出列表 [1,2,2],不同的排列有:

[
  [1,2,2],
  [2,1,2],
  [2,2,1]
]

挑战

使用递归和非递归分别完成该题。

解题思路

    这道题是在全排列的基础上解决的,对于不理解全排列的同学,可以我的上一篇文章全排列.由于有重复的元素,那么我们需要剪枝,这里我们使用一个map来进行判断,如果没有重复元素,就将元素插入到map,否者不就行全排列。

实现代码

class Solution {  
public:  
    bool is_a_solution(int k,int n)  
{  
    return n==k;  
}  
  
void process_solution(int solution[],vector &nums,vector> &result)  
{  
    vector tmp;  
    for(int i=1;i<=nums.size();i++)  
    {  
        tmp.push_back(nums[solution[i]]);  
    }  
    result.push_back(tmp);  
}  
  
void construct_candidates(int candidates[],bool position[],int n,map &pure,vector &nums,int *ncandidates)  
{  
    for(int i=0,count=0;i &nums,bool position[],vector> &result)  
{  
    int candidates[1000];  
    int ncandidates=0;  
    map pure;  
    if(is_a_solution(k,n))  
    {  
        process_solution(solution,nums,result);  
    }  
    else  
    {  
        k++;  
        construct_candidates(candidates,position,n,pure,nums,&ncandidates);  
        for (int i = 0; i > permuteUnique(vector& nums) {  
        int solution[1001];  
    bool position[1001];  
    memset(position,false,sizeof(position));  
    vector> result;  
    backtrack(solution, 0, nums.size(), nums, position,result);  
    return result;  
    }  
};  


你可能感兴趣的:(LintCode,LintCode刷题指南)