Permutations

来源:互联网 发布:产品价格查询软件 编辑:程序博客网 时间:2024/05/03 06:24


Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

class Solution {public:    void heapKeep(vector<int> &num,int i,int len){        int max=i;        int le = 2*i;        int ri = 2*i+1;        if (le<len && num[le]>num[max])            max = le;        if (ri<len && num[ri]>num[max])            max = ri;        if (max != i) {            swap(num[i],num[max]);            heapKeep(num,max,len);        }    }    void heapBuild(vector<int> &num){        int len = num.size();        for (int i=len/2; i>=0; --i){            heapKeep(num,i,len);        }    }    void heapSort(vector<int> &num){        int len = num.size();        heapBuild(num);        for (int i=len-1; i>0; --i){            swap(num[0],num[i]);            heapKeep(num,0,i);        }    }    void reserveVec(vector<int> &num,int begin,int end){        while (begin<end) {            swap (num[begin++],num[end--]);        }    }    vector<vector<int> > permute(vector<int> &num) {        //从小到大        int len = num.size();        vector<vector<int>> vec;        if (len==0) return vec;        heapSort(num);        while (true) {            int index =len -1;            int littlebig = index;            vec.push_back(num);            while (index>=1 && num[index-1]>num[index]) {                index--;            }            if (index==0) return vec;            while (num[littlebig]<=num[index-1]){                littlebig--;            }            swap(num[littlebig],num[index-1]);            reserveVec(num,index,len-1);        }        return vec;    }};


0 0