Permutation & Combination

来源:互联网 发布:淘宝网店经营技巧 编辑:程序博客网 时间:2024/06/06 17:43

1.Permutation:

1.1 Recursion

Perm(vec, beg, end)

1.When beg = end, print;

2.Otherwise swap the first element denoted by beg with following elements, then do Perm(vec, beg + 1, end):

for(i = beg; i <= end; ++i)

swap(beg, i);

Perm(vec, beg+1, end);

swap(beg,i);

    vector<vector<int>> permutation(vector<int> &nums)    {        sort(nums.begin(), nums.end());        vector<vector<int>> ret;        permutation(nums, 0, ret);        return ret;    }    void permutation(vector<int> nums, int beg, vector<vector<int>> &ret)    {        if(beg == nums.size()-1)        {            ret.push_back(nums);            return;        }        for(int i = beg; i < nums.size(); ++i)        {            vector<int> tmp = nums;            if(i == beg || nums[i] != nums[i-1])    //handle duplicates            {                swap(nums[beg], nums[i]);                permutation(nums, beg + 1, ret);                nums = tmp;            }        }    }

1.2 Non-recursion

    vector<vector<int>> permuteUnique(vector<int>& nums)     {        sort(nums.begin(), nums.end());        vector<vector<int>> ret;        ret.push_back(nums);        int k = -1, l = -1;        while(true)        {            k = -1, l = -1;            for(int i = 0; i < nums.size()-1; ++i)                if(nums[i] < nums[i + 1])                    k = i;            if(k == -1) break;            for(int i = k + 1; i < nums.size(); ++i)                if(nums[i] > nums[k])                    l = i;            swap(nums[k], nums[l]);            reverse(nums.begin() + k + 1, nums.end());            ret.push_back(nums);        }        return ret;    }


2.Combination

The result is stored in vector<vector<int>> &v. The helper function take vec as the first parameter which stores the integers that will be used to perform the combination. k is the number of integers that will be used.
class Solution <span style="font-family: Arial, Helvetica, sans-serif;">{</span>
public:void Comb(int k, vector<vector<int>> &v){<span style="white-space:pre"></span>vector<int> vec, tmp;<span style="white-space:pre"></span>for(int i = 0; i < 9; ++i)<span style="white-space:pre"></span>vec.push_back(i+1);<span style="white-space:pre"></span>Comb(vec, 0, tmp, k, v);}void Comb(vector<int> &vec, int beg, vector<int> &tmp, int k, vector<vector<int>> &v){<span style="white-space:pre"></span>if(k == 0 )<span style="white-space:pre"></span>{<span style="white-space:pre"></span>v.push_back(tmp);<span style="white-space:pre"></span>return;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>for(int i = beg; i <= vec.size() - k; ++i)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>tmp.push_back(vec[i]);<span style="white-space:pre"></span>Comb(vec, i+1, tmp,  k-1, v);<span style="white-space:pre"></span>tmp.pop_back();<span style="white-space:pre"></span>}};



0 0
原创粉丝点击