全排列(LeetCode 46 回溯)

題目

給定一個(gè)沒有重復(fù)數(shù)字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

解析

“全排列”就是一個(gè)非常經(jīng)典的“回溯”算法的應(yīng)用。我們知道函似,N 個(gè)數(shù)字的全排列一共有 N! 這么多個(gè)俊庇。
大家可以嘗試一下在紙上寫 3 個(gè)數(shù)字、4 個(gè)數(shù)字魏割、5 個(gè)數(shù)字的全排列,相信不難找到這樣的方法钢颂。
以數(shù)組 [1, 2, 3] 的全排列為例见妒。

我們先寫以 1 開頭的全排列,它們是:[1, 2, 3], [1, 3, 2]甸陌;
再寫以 2 開頭的全排列须揣,它們是:[2, 1, 3], [2, 3, 1];
最后寫以 3 開頭的全排列钱豁,它們是:[3, 1, 2], [3, 2, 1]耻卡。

我們只需要按順序枚舉每一位可能出現(xiàn)的情況,已經(jīng)選擇的數(shù)字在接下來要確定的數(shù)字中不能出現(xiàn)牲尺。按照這種策略選取就能夠做到不重不漏卵酪,把可能的全排列都枚舉出來幌蚊。

在枚舉第一位的時(shí)候,有 3 種情況溃卡。
在枚舉第二位的時(shí)候溢豆,前面已經(jīng)出現(xiàn)過的數(shù)字就不能再被選取了;
在枚舉第三位的時(shí)候瘸羡,前面 2 個(gè)已經(jīng)選擇過的數(shù)字就不能再被選取了漩仙。

這樣的思路,我們可以用一個(gè)樹形結(jié)構(gòu)表示犹赖《铀看到這里的朋友,建議自己先嘗試畫一下“全排列”問題的樹形結(jié)構(gòu)峻村。
使用編程的方法得到全排列麸折,就是在這樣的一個(gè)樹形結(jié)構(gòu)中進(jìn)行編程,具體來說粘昨,就是執(zhí)行一次深度優(yōu)先遍歷垢啼,從樹的根結(jié)點(diǎn)到葉子結(jié)點(diǎn)形成的路徑就是一個(gè)全排列。


樹形結(jié)構(gòu)圖

代碼

     public IList<IList<int>> Permute(int[] nums) {
        IList<IList<int>> res = new List<IList<int>>();
        int[] tempArr = new int[nums.Length];
        bool[] vis = new bool[nums.Length];
        BackTrackPermute(0,nums.Length,nums,vis,res,tempArr);
        return res;
    }

    void BackTrackPermute(int cur,int len,int[] nums, bool[] vis,IList<IList<int>> res,int[] tempArr)
    {
        if (cur == len)
        {
            res.Add(new List<int>(tempArr));
            return;
        }

        for (int i = 0; i < len; i++)
        {
            if(vis[i]) continue;//如果已經(jīng)使用則繼續(xù)
            vis[i] = true;
            tempArr[cur] = nums[i];//把當(dāng)前的cur的值賦為nums[i]的值
            BackTrackPermute(cur+1,len,nums,vis,res,tempArr);//繼續(xù)
            vis[i] = false; //狀態(tài)重置
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末张肾,一起剝皮案震驚了整個(gè)濱河市芭析,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌浩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件工秩,死亡現(xiàn)場離奇詭異尸饺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)助币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門浪听,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眉菱,你說我怎么就攤上這事迹栓。” “怎么了俭缓?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵克伊,是天一觀的道長。 經(jīng)常有香客問我华坦,道長愿吹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任惜姐,我火速辦了婚禮犁跪,結(jié)果婚禮上椿息,老公的妹妹穿的比我還像新娘。我一直安慰自己坷衍,他們只是感情好寝优,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枫耳,像睡著了一般乏矾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘉涌,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天妻熊,我揣著相機(jī)與錄音,去河邊找鬼仑最。 笑死扔役,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的警医。 我是一名探鬼主播亿胸,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼预皇!你這毒婦竟也來了侈玄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤吟温,失蹤者是張志新(化名)和其女友劉穎序仙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲁豪,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潘悼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爬橡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片治唤。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糙申,靈堂內(nèi)的尸體忽然破棺而出宾添,到底是詐尸還是另有隱情,我是刑警寧澤柜裸,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布缕陕,位于F島的核電站,受9級(jí)特大地震影響疙挺,放射性物質(zhì)發(fā)生泄漏榄檬。R本人自食惡果不足惜遍坟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一沽瞭、第九天 我趴在偏房一處隱蔽的房頂上張望藕甩。 院中可真熱鬧土匀,春花似錦、人聲如沸舱殿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪袭。三九已至湾宙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冈绊,已是汗流浹背侠鳄。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留死宣,地道東北人伟恶。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像毅该,于是被迫代替她去往敵國和親博秫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361