Leetcode:Permutations 数组的全排列

Leetcode刷题刷到了Permutation,自己用递归写了一下数组全排列的算法,再深入理解一下递归的算法思想。

在遇到稍微复杂的问题之后要尝试从简单的问题入手,举几个小例子,找到规律,然后用程序语言描述出规律就OK了。

假如数组是[1,2,3],其全排列为[1,2,3],[1,3,2],[2,1,3],2,3,1],[3,2,1],[3,1,2].

全排列的过程如下:

1.首先将1固定,递归求子数组[2,3]的全排列;

2.将1和2交换,递归求[1,3]的全排列;

3.因为第二步中1和2进行了交换,因此需要再把1交换回来,交换回来之后再将1和3进行交换,再递归求[1,2]的全排列。

递归结束的条件是只剩下一个元素时,把整个排列好的数组存入一个二维数组中。

代码如下:

class Solution {
public:
    void swap(int &a,int &b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    void permutation(vector<int> &num,int begin,int end,vector<vector<int> > &vec)
    {
        if(begin == end)
            vec.push_back(num);
        if(begin < end)
        {
            for(int i = begin;i <= end;i++)
            {
                swap(num[begin],num[i]);
                permutation(num,begin + 1,end,vec);
                swap(num[begin],num[i]);
            }
        }       
    }
    vector<vector<int> > permute(vector<int> &num) {
        int length = num.size();
        vector<vector<int> > vec;
        if(length == 0)return vec;
        permutation(num,0,length - 1,vec);
        return vec;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值