Leetcode Summary 全排列12總結

2021-09-25 12:14:13 字數 1114 閱讀 5506

給出陣列,要求,這個陣列的全排列

全排列1: 陣列中沒有重複的數字。

solution:這種問題直接用dfs求出陣列排列的每種情況即可。用dfs可以用幾種方法,一種是普通迭代法,用乙個陣列儲存當前還沒放進去的數字,然後去迭代,注意:這個陣列只能按值傳遞。比較容易理解,**如下

class solution 

void getpermute(vectorcurnums,vector> & res,vectorcurres)

for(int i = 0;i交換法做dfs,就是把當前數字和陣列後面的每乙個數字依次進行替換,然後去迭代。

這裡就不寫**了,但是注意每次迭代之後要再交換回來。

全排列2:陣列中可能有重複的數字,這時候對陣列進行全排列可能回出現重複的情況。需要進行剪枝,這裡有多種演算法,但本人比較菜,只能看懂最簡單的一種:

**如下:

class solution

void permuteuniquedfs(vector& nums, int level, vector& visited, vector& out, vector>& res)

for (int i = 0; i < nums.size(); ++i)

}};

在使用上面的方法的時候,一定要能弄清楚遞迴函式的for迴圈中兩個if的剪枝的意思。在此之前,首先要弄清楚level的含義,這裡由於我們是用陣列out來拼排列結果,這裡的level其實就是當前已經拼成的個數,其實就是out陣列的長度。我們看到,for迴圈的起始是從0開始的,而本題的解法二,三,四都是用了乙個start變數,從而for迴圈都是從start開始,一定要分清楚start和本解法中的level的區別。由於遞迴的for都是從0開始,難免會重複遍歷到數字,而全排列不能重複使用數字,意思是每個nums中的數字在全排列中只能使用一次(當然這並不妨礙nums中存在重複數字)。不能重複使用數字就靠visited陣列來保證,這就是第乙個if剪枝的意義所在。關鍵來看第二個if剪枝的意義,這裡說當前數字和前乙個數字相同,且前乙個數字的visited值為0的時候,必須跳過。這裡的前乙個數visited值為0,並不代表前乙個數字沒有被處理過,也可能是遞迴結束後恢復狀態時將visited值重置為0了。

思路來自

秋招加油!!!

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

46 全排列 47 全排列II

46.全排列 這題和之前做的劍指offer上的字串全排列。一樣。分析 1 如果原始要排列的陣列順序為1 2 3 4,現在只要分別交換1 2,1 3,1 4然後對剩下的3個元素進行遞迴的排列。自己的code 100 class solution if start nums.size 1 return ...

輸出全排列(C 全排列函式)

請編寫程式輸出前n個正整數的全排列 n 10 並通過9個測試用例 即n從1到9 觀察n逐步增大時程式的執行時間。輸入格式 輸入給出正整數n 10 輸出格式 輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a 1,a2,an 排在序列b1,b2,bn之前,如果存在k使得...