46. 47. Permutations

求全排列。

1. 无重复元素

Given a collection of distinct 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].

 

* The algroithm - Take each element in array to the first place.
* For example:
* 0) initalization
* pos = 0
* [1, 2, 3]
* 1) take each element into the first place,
* pos = 1
* [1, 2, 3] ==> [2, 1, 3] , [3, 1, 2]
* then we have total 3 answers
* [1, 2, 3], [2, 1, 3] , [3, 1, 2]
* 2) take each element into the "first place" -- pos
* pos = 2
* [1, 2, 3] ==> [1, 3, 2]
* [2, 1, 3] ==> [2, 3, 1]
* [3, 1, 2] ==> [3, 2, 1]
* then we have total 6 answers
* [1, 2, 3], [2, 1, 3] , [3, 1, 2], [1, 3, 2], [2, 3, 1], [3, 2, 1]
* 3) pos = 3 which greater than length of array, return.

vector<vector<int>> permute(vector<int>& nums) {
    int n = nums.size(), l, i, j, k;
    vector<vector<int>> ans;
    ans.push_back(nums);
    for(k = 0; k < n-1; k++)
    {
        l = ans.size();
        for(i = 0; i < l; i++)
        {
            for(j = 1; k+j < n; j++)
            {
                vector<int> v = ans[i];
                swap(v[k], v[k+j]);
                ans.push_back(v);
            }
        }
    }
    return ans;
}

 

2. 有重复元素

// To deal with the duplication number, we need do those modifications:
// 1) sort the array [pos..n].
// 2) skip the same number.

vector<vector<int>> permuteUnique(vector<int>& nums) {
    int n = nums.size(), l, i, j, k;
    vector<vector<int>> ans;
    ans.push_back(nums);
    for(k = 0; k < n-1; k++)
    {
        l = ans.size();
        for(i = 0; i < l; i++)
        {
            sort(ans[i].begin()+k, ans[i].end());
            for(j = 1; k+j < n; j++)
            {
                vector<int> v = ans[i];
                if(v[k+j] == v[k+j-1])
                    continue;
                swap(v[k], v[k+j]);
                ans.push_back(v);
            }
        }
    }
    return ans;
}

 

转载于:https://www.cnblogs.com/argenbarbie/p/5264267.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值