1. 程式人生 > >Leetcode 46. Permutation 全排列

Leetcode 46. Permutation 全排列

解決思路:

排列:從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列;

全排列:當n==m時,稱為全排列;

比如:集合{ 1,2,3}的全排列為:

{ 1 2 3}

{ 1 3 2 }

{ 2 1 3 }

{ 2 3 1 }

{ 3 2 1 }

{ 3 1 2 }

我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為{1,2,3}的排列列舉樹,此樹和我們這裡介紹的演算法完全一致;

演算法思路:

(1)n個元素的全排列=(n-1個元素的全排列)+(另一個元素作為字首);

(2)出口:如果只有一個元素的全排列,則說明已經排完,則輸出陣列;

(3)不斷將每個元素放作第一個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> result;
        generate(nums, result, 0, nums.size() - 1);
        return result;
    }
    void generate(vector<int>& nums, vector<vector<int>> &result, int begin, int end)
    {
        if(begin == end)   //如果已經到了最後一個元素,全排列只有自己,故返回
        {
            result.push_back(nums);
            return;
        }
        else
        {
            //不斷交換元素進行全排列
            for(int i = begin; i <= end; i++)
            {
                swap(nums[begin], nums[i]);
                generate(nums, result, begin + 1, end);  //對numns[begin + 1, end]進行全排列
                swap(nums[begin], nums[i]);
            }
           
        }
    }
};