全排列递推的方法

网上搜索全排列都是递归的方法,感觉虽然理解的递归的思想,但真正拿来写代码的时候总觉得不是那么个事情。既然能递归那么一般都是能够反过来递推的,然后自己琢磨了一下递推的方法。

思路:
递归是全部开始,那递推就是从0开始,其实就是插空的思想,在前一个全排列的基础上,插空出新的全排列
例如:1,2,3,4

step1: 1
那么它的空位就是 空1 1空
这里空位就可以用2来代替
得到我们新的全排列 21 12

step1: 21 12
空位:空21 2空1 21空 空12 1空2 12空
空位用3来代替
得到新的全排列: 321 231 213 312 132 123

….
以此类推

感觉递推的思想比递归的思想差不多,但是更好理解和写代码,感觉不同点可能是要自己去申请内存。


代码如下:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Solution
{
public:
    vector<string> perm(int *input,unsigned int  n)
    {
        vector<string> result;
        if (n == 0)
            return result;
        for (int i=0;i<n;i++)
        {
            insertresult(result,input[i]);
        }
        return result;
    }

private:
    void insertresult(vector<string> &result, int nowinsert)
    {
        if (result.empty())
        {
            result.resize(1);
            result[0]+= to_string(nowinsert);
            return;
        }
        int nowfornum = result.size() - 1;
        int nowposition = result.size() * (1 + result[0].size());
        result.resize(nowposition);//动态申请空间,其实也可以最开始有输入的时候直接申请所有的空间
        for (int i= nowfornum;i>=0;i--)//从后向前,防止顶掉数据
        {
            int insertmax = result[i].size() + 1;
            for (int j=0;j < insertmax;j++)
            {
                string nowstring = result[i];
                nowstring.insert(j, to_string(nowinsert));
                result[--nowposition] = nowstring;
            }
        }
    }

};

int main()
{
    int input[4] = { 1,2,3,4 };
    Solution solution;
    vector<string> result = solution.perm(input, 4);
    for (auto a: result)
    {
        cout << a << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值