Permutations II

来源:互联网 发布:笔记本如何安装软件 编辑:程序博客网 时间:2024/05/29 18:57

题目大意,求一个数组的全排序,这个数组可能会有重复的数

跟poj的题目一样,具体见http://blog.csdn.net/xiaoxiaoluo/article/details/8169537


#include <algorithm>#include <vector>using namespace std;class Solution {public:    vector<vector<int> > permuteUnique(vector<int> &num) {        bool flag = false;        vector<vector<int> > result;        sort(num.begin(), num.end());        do {            flag = false;            result.push_back(num);            int i, j;            for(i = num.size() - 1; i > 0; i--) {                if(num[i] > num[i - 1]) {                    flag = true;                    break;                }            }            if(flag) {                for(j = num.size() - 1; j >= i; j--) {                    if(num[j] > num[i - 1]) {                        swap(num[j], num[i - 1]);                        reverse(num, i, num.size() - 1);                        break;                    }                }            }        } while(flag);        return result;    }private:    void reverse(vector<int> &num, int begin, int end) {        for(int i = begin, j = end; i < j; i++, j--) {            swap(num[i], num[j]);        }    }};


另一种递归的方法。

为了去掉重复的情况,要加一个可交换的判断函数。

若第i个数字与第j个数字交换,必须满足[i, j)区间内,没有数与第j个数字相等

#include <algorithm>#include <vector>using namespace std;class Solution {public:    vector<vector<int> > permuteUnique(vector<int> &num) {        vector<vector<int> > result;        sort(num.begin(), num.end());        permuteUniqueAssist(num, 0, result);        return result;    }private:       void permuteUniqueAssist(vector<int> &num, int start, vector<vector<int> > &result) {        if(start >= num.size()) {            result.push_back(num);            return;        }        for(int i = start; i < num.size(); i++) {            if(i == start || canSwap(num, start, i) ){                swap(num[start], num[i]);                permuteUniqueAssist(num, start + 1, result);                swap(num[start], num[i]);            }        }    }    bool canSwap(vector<int> &num, int start, int end) {        for(int i = start; i < end; i++) {            if(num[i] == num[end]) {                return false;            }        }        return true;    }};



0 0
原创粉丝点击