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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章