lintcode 15 全排列

class Solution {
public:
    /*
     * @param nums: A list of integers.
     * @return: A list of permutations.
     */
    vector<vector<int>> permute(vector<int> &nums) {
        // write your code here
        vector<vector<int>> res;
        if(nums.size() < 2)
        {
            res.push_back(nums);
            return res;
        }
        help(res,0,nums.size(),nums);
        return res;
    }
    
    void help(vector<vector<int>>& res,int begin,int end,vector<int> &nums)//得到從begin開始的全排列
    {
        if(begin == end){                      //基本情況  
            res.push_back(nums);             
        }else{
            for(int i = begin;i < end;i++){//遍歷整個數(shù)組
                swap(nums[begin],nums[i]);//把被遍歷的數(shù)放在首位
                help(res,begin+1,end,nums);//求首位之后的所有排列情況
                swap(nums[begin],nums[i]);//恢復(fù)原始數(shù)組
            }
        }
    }
    void swap(int& a,int& b){
        int temp = a;
        a = b;
        b = temp;
    }
};

遞歸算法思路:對數(shù)據(jù)[1,2,3],需要一次遍歷;每次遍歷,確定首位,[1,...];[2,...];[3,...]然后通過遞歸得到后面的所有排列情況,對于數(shù)組中有重復(fù)元素的情況,我們只要保證,重復(fù)元素只能有一次作為子問題的開頭元素,這樣我們就可以避免重復(fù)計算。

非遞歸算法思路:https://www.cnblogs.com/answeryi/archive/2011/10/12/2209058.html
字典排序 注意 逆序的步驟不要錯過

class Solution {
public:
    /*
     * @param nums: A list of integers.
     * @return: A list of permutations.
     */
    vector<vector<int>> permute(vector<int> &nums) {
        // write your code here
        vector<vector<int>> res;
        if(nums.size() < 2){
            res.push_back(nums);
            return res;
        }
        sort(nums.begin(),nums.end());
        int point = -1;
        res.push_back(nums);
        while((point = findpoint(nums)) != -1){
            int next = findnext(nums,point);
            swap(nums[point-1],nums[next]);
            diandao(nums,point);
            res.push_back(nums);
        }
        return res;
    }
    int findpoint(vector<int> &nums){
        int len =  nums.size();
        for(int i = len-1;i >0;i--){
            if(nums[i] > nums[i-1])
                return i;
        }
        return -1;
    }
    int findnext(vector<int> &nums,int point){
        int len  = nums.size();
        int i  = 0;
        for(i = point; i < len;i++){
            if(nums[point-1] > nums[i]){
                return i-1;
            }
        }
        return i-1;
    }
    void  diandao(vector<int> &nums,int point){
        int j = nums.size()-1;
        int i = point;
        while(i < j){
            swap(nums[i],nums[j]);
            i++;
            j--;
        }
    }
    void swap(int& a,int& b){
        int temp;
        temp = a;
        a = b;
        b = temp;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1)這本書為什么值得看: Python語言描述,如果學(xué)的Python用這本書學(xué)數(shù)據(jù)結(jié)構(gòu)更合適 2016年出版,內(nèi)容...
    孫懷闊閱讀 12,903評論 0 15
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對這種結(jié)構(gòu)定義相應(yīng)的運算,而且確保經(jīng)過這...
    Winterfell_Z閱讀 6,603評論 0 13
  • 任之行于英彬日精進分享 顯現(xiàn)-練習(xí)——使用 我行,一切行,我行任之行 選好人,做對事 懂人事 體驗價值從滿足身...
    于英彬閱讀 230評論 0 0
  • 人性看的太透,反而不知道怎么講,也不是好事。 要我覺得,看透一點多就好。不太多,也不太少。而且這種看透的沼澤,也不...
    葉脊閱讀 138評論 0 0
  • 每天提升能量并更加的連接:1.持續(xù)讀每天的功課,活在功課或富足錄音里;2.冥想;3.每天分享奇跡;4.活在當(dāng)下,接...
    海波完美旅程閱讀 231評論 0 1

友情鏈接更多精彩內(nèi)容