Permutations II 题解

题目来源:Permutations II

> Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example, [1,1,2] have the following unique permutations: [1,1,2], [1,2,1], and [2,1,1].

解题思路:

Permutations思路差不多,分为下面几种解法。

置换法

Permutations一样,每一个与第一个交换~用set存结果,将重复的去掉,中途剪枝下即可AC。

    void dfs(set<vector<int> > &result, vector<int> &num, int start)
    {
        if(start >= num.size()) // >= ">"also should be put in, for the last ele.
        {
            result.insert(num);
            return;
        }
        for(int i = start; i < num.size(); i++)
        {
            if(i != start && num[i] == num[i-1]) continue; //culling
            std::swap(num[i], num[start]);
            dfs(result, num, start+1);
            std::swap(num[i], num[start]);
        }
    }

    vector<vector<int> > permuteUnique(vector<int> &num)
    {
        set<vector<int> > result;
        std::sort(num.begin(), num.end());
        dfs(result, num, 0);
        return vector<vector<int>>(result.begin(), result.end());
    }

增量构造

或者跟permutation的方法,增量构造, 这里需要用一个map存下数量。

next_permunation

自然序的下一个:1 3 5 4 2,从后往前找,找到第一个降序(从后往前看)的数字3,然后找后面的比3大的最小的数字4,交换,1 4 5 3 2,然后交换index后面的序列逆序 532->235,构成下一个自然序:1 4 2 3 5。

Last updated

Was this helpful?