全排列和去重全排列 遞迴實現

2021-07-30 23:11:35 字數 946 閱讀 9758

一、全排列的概念:

根據360百科,我們知道從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。

二、全排列的演算法:

三、接下來我們學習第一種方法—–遞迴實現全排列

#include

#include

using

namespace

std;

void perm(int* array,size_t size,size_t n)//保證陣列array前n個數不動,進行全排列

for(size_t i=n; iarray[n],array[i]);

perm(array,size,n+1);

swap(array[n],array[i]);

}}int main()

; perm(arr,4,1);

getchar();

return

0;}

四、去重的全排列

#include

#include

using

namespace

std;

bool isswap(int* array,int i,int n)//若兩個值相等則不交換,當前的兩個值是array[i]與array[n],

return

true;

}void perm(int* array,size_t size,size_t n)//保證陣列array前n個數不動,進行全排列

for(size_t i=n; iif(isswap(array,i,n))

}}int main()

; perm(arr,4,1);

getchar();

return

0;}

去重全排列的遞迴實現

由於全排列就是從第乙個數字起每個數分別與它後面的數字交換。我們先嘗試加個這樣的判斷 如果乙個數與後面的數字相同那麼這二個數就不交換了。如122,第乙個數與後面交換得212 221。然後122中第二數就不用與第三個數交換了,但對212,它第二個數與第三個數是不相同的,交換之後得到221。與由122中第...

46 全排列 全排列 遞迴

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

遞迴實現全排列

生成全排列的最簡單的遞迴方法的思想 1.可以把幾個數字分成前半部和最後一位。對於0123這四個數來說,最後一位 紅色字型 所出現的情況只有以下四類 先不管前三個數的排列組合情況 3 2 1 0這樣我們就把四個數字的排列問題,變成了3個 對於上述的每一行來說 2.終結條件是1個數字的排列就是其本身。直...