Leetcode 47. Permutations II

来源:互联网 发布:mac照片占用空间 编辑:程序博客网 时间:2024/06/02 17:06

题意

生成一个数组的全排列,去除重复的排列数组

题解

用递归实现。每个位置的数字都能和它后面的所有数字交换的,一共有n!种。
用set去重超时,需要在递归中剪枝。如果交换中两个数的中间有一个数和后面的交换数相同(说明前面的循环中已经生成过此种排列),则停止生成此种排列。

代码

class Solution {public:    vector<vector<int> > result;    bool canSwap(vector<int> &nums, int begin, int end)    {        for(int i = begin; i < end; i++)        {            if(nums[i] == nums[end])                return false;        }        return true;    }    void gen_permutation(int pos, vector<int> &nums)    {        if(pos == nums.size())        {            result.push_back(nums);        }        else        {            for(int i = pos; i < nums.size(); i++)            {                if(canSwap(nums, pos, i))//// if previsous loop hasn't this permutation that start with nums[pos]                {                    swap(nums[i], nums[pos]);                    gen_permutation(pos + 1, nums);                    swap(nums[i], nums[pos]);                }            }        }    }    vector<vector<int> > permuteUnique(vector<int>& nums) {        gen_permutation(0, nums);        return result;    }};
0 0