題目:找到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 即該集合中減去對應元素 思路其實說直白點,就是遞...