LeetCode第46题之 Permutations

主要的思想(深度优先搜索)和我这篇博客一样:找出1到n所有不重复的排列,即n的全排列

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

class Solution {
    void fun(vector<int> &nums, vector<bool> &appear, vector<int> &method, vector<vector<int>> &res)
    {
        int n = nums.size();
        //如果得到一种满足题意的情况,则保存下来
        if (n == method.size())
        {
            res.push_back(method);
            return;
        }
        for (int i=0;i<n;++i)
        {
            //如果第i个数没有出现过,则放到method中,然后递归放下一个数
            if (!appear[i])
            {
                method.push_back(nums[i]);
                appear[i] = true;
                fun(nums, appear, method, res);
                //回溯
                method.pop_back();
                appear[i] = false;
            }
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        int n = nums.size();
        //appear 记录n个数的出现情况
        vector<bool> appear(n,false);
        //保存最终的结果
        vector<vector<int>> res;
        //保存当前的某一种满足题意的情况
        vector<int> method;
        fun(nums, appear, method, res);
        return res;
    }
};

int main()
{
    Solution s;
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    vector<vector<int>> res = s.permute(v);
    //输出结果
    for (vector<vector<int>>::iterator ita=res.begin();ita!=res.end();++ita)
    {
        for (vector<int>::iterator itb=ita->begin();itb!=ita->end();++itb)
        {
            cout<<*itb<<'\t';
        }
        cout<<endl;
    }
    return 0;
}

updata 2016.07.14
今天看到这种类型题目的新解法,于是用运用到该题上。运行了下,效率比第一种高不少。
解法二
思想:求整个数组的全排列可以分成两步:(1)求所有可能出现在第一个位置的数字;(2)固定第一个数字,求后面数字的全排列。这时,求后面数字的全排列我们仍把后面的所有数字分如上两步走,…
C++代码:

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

class Solution {
public:
    //求nums中,下标从i_begin到nums.size()-1的全排列
    void permution(vector<int>& nums, int i_begin, vector<vector<int>> &res)
    {
        //如果到达末尾,则保存这一排列
        if (i_begin == nums.size()-1) 
            res.push_back(nums);
        else
        {
            for (int i=i_begin;i<nums.size();++i)
            {
                //交换下标为i_begin和i的元素
                int tmp = nums[i];
                nums[i] = nums[i_begin];
                nums[i_begin] = tmp;
                //递归求剩下元素的全排列
                permution(nums, i_begin+1, res);
                //回溯时,复原下标为i_begin和i的元素
                tmp = nums[i];
                nums[i] = nums[i_begin];
                nums[i_begin] = tmp;
            }
        }

    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        if (nums.size())
        {
            permution(nums, 0, res);
        }
        return res;
    }
};
int main()
{
    Solution s;
    vector<int> v;
    for (int i=1;i<=3;++i)
    {
        v.push_back(i);
    }
    vector<vector<int>> res = s.permute(v);
    for (vector<vector<int>>::iterator ita=res.begin();ita!=res.end();++ita)
    {
        for (vector<int>::iterator itb=ita->begin();itb!=ita->end();++itb)
        {
            cout<<*itb<<' ';
        }
        cout<<endl;
    }
    return 0;
}
发布了90 篇原创文章 · 获赞 38 · 访问量 19万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章