LeetCode算法题之Permutations

问题描述:
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].
给一个内部元素互不相等的集合,求它的全排列。
解题思路:
利用栈的方法模拟数字的空位插入,如果集合元素有重复的,我这写的肯定TLE,太渣太渣,还好勉强AC了,
这里应该必须用DFS啊,请自己搜索!

class Solution
{
public:
    vector<vector<int> > permute(vector<int> &num)
    {
        vector<vector<int> > Permute;
        if(num.size() <= 1)
        {
            Permute.push_back(num);
            return Permute;
        }
        vector<int> elemOfPermute;
        elemOfPermute.push_back(num[0]);
        elemOfPermute.push_back(num[1]);
        Permute.push_back(elemOfPermute);
        elemOfPermute.clear();
        elemOfPermute.push_back(num[1]);
        elemOfPermute.push_back(num[0]);
        Permute.push_back(elemOfPermute);
        if(num.size() == 2)
        {
            return Permute;
        }

        for(size_t i=2; i<num.size(); i++)
        {
            vector<vector<int> > tempPermute;
            for(size_t j=0; j<Permute.size(); j++)
            {
                vector<vector<int> > temp;
                temp = insertElem(i ,Permute[j], num[i]);
                for(size_t k=0; k<temp.size(); k++)
                {
                    tempPermute.push_back(temp[k]);
                }
            }
            Permute.clear();
            Permute = tempPermute;
            tempPermute.clear();
        }

        return Permute;
    }
    vector<vector<int> > insertElem(unsigned int initSize, vector<int> arrayOfNum, int numIsInserted)
    {
        stack<int> stk;

        vector<vector<int> > Permute;
        for(size_t i=0; i<initSize; i++)
        {
            stk.push(arrayOfNum[i]);
        }
        for(size_t i=0; i<arrayOfNum.size()+1; i++)
        {
            vector<int> elemOfPermute;
            stack<int> tempStack = stk;
            for(size_t j=0; j<i; j++)
            {
                elemOfPermute.push_back(tempStack.top());
                tempStack.pop();
            }
            tempStack.push(numIsInserted);
            while(!tempStack.empty())
            {
                elemOfPermute.push_back(tempStack.top());
                tempStack.pop();
            }
            Permute.push_back(elemOfPermute);
        }
        return Permute;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值