全排列的非遞迴解法

2021-09-10 08:54:05 字數 1078 閱讀 9991

題目:找到12345的全排列所有結果。

思路:所有的全排列組成的數字中,12345最小,54321最大。演算法本質是找到給定數字m1的下乙個數字m2,m2是所有全排列組成的數字集合中大於m1的數字組成的集合的最小值。比如12345下一位是12354。

1,從右往左找到非公升序的第一位數

例如12543中543是公升序,2就是要找的數字。

2,找到公升序部分最小的數字,交換

第一步中的543中最小值為3,2和3交換,得到13542。

3,原來的公升序部分進行排序

13542中對542進行排序後是245,最終得到13245。

**

public class solution 

listlist = new arraylist<>();

listtemp = new arraylist<>();

for(int i : nums)

res.add(list);

while((temp = getnext(list)) != null)

return res;

}public listgetnext(listlist)

int i = 0;

for(i = len - 1; i > 0; i--)

}if(i == 0) return null;

int minindex = i;

for(int j = i + 1; j < len; j++)

int temp = nums[i - 1];

nums[i - 1] = nums[minindex];

nums[minindex] = temp;

arrays.sort(nums, i, len);

listres = new arraylist<>(len);

for(int j : nums)

return res;

}}

c全排列解法 非遞迴

只要對字串求出字典序即可實現全排列 求法 要考慮全排列的非遞迴實現,先來考慮如何計算字串的下乙個排列。如 1234 的下乙個排列就是 1243 只要對字串反覆求出下乙個排列,全排列的也就迎刃而解了。如何計算字串的下乙個排列了?來考慮 926520 這個字串,我們從後向前找第一雙相鄰的遞增數字,20 ...

全排列 非遞迴

description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...

演算法 全排列遞迴解法

問題 有一組數r,需要輸出它的全排列。r的遞迴可定義如下 當個數n為1時,perm 其中r是集合r中唯一的元素 當個數n大於1時,perm 由 r1 perm r1 r2 perm r2 r3 perm r3 rn perm rn 構成 其中ri r 即該集合中減去對應元素 思路其實說直白點,就是遞...