第一种思路是使用 Next Permutation 中的思路,不断迭代,求下一个全排列即可,需要注意的是,一个序列全排列的个数是 n!个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import "sort" func permute(nums []int) [][]int { n:=len(nums) if n<=1 { return [][]int{nums} } retLen:=1 for i:=n;i>=2;i-- { retLen*=i } ret:=make([][]int,retLen) t:=make([]int,n) copy(t,nums) ret[0]=t for i:=1;i<retLen;i++ { j:=n-2 k:=n-1 for j>=0 && nums[j]>=nums[j+1]{ j-- } if j>=0{ for nums[k]<=nums[j]{ k-- } nums[j],nums[k]=nums[k],nums[j] } sort.Ints(nums[j+1:]) t:=make([]int,n) copy(t,nums) ret[i]=t } return ret }
|
另一种思路是使用回溯递归,将每一种情况使用递归的方式加入进去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| func backtracking(ret *[][]int, nums[]int, now []int){ if len(nums)==len(now) { t:=make([]int,len(nums)) copy(t,now) *ret=append(*ret,t) return } for _,n:=range nums { needContinue:=false for _,t:=range now{ if t==n { needContinue=true break } } if !needContinue { now=append(now,n) backtracking(ret,nums,now) now=now[:len(now)-1] } } } func permute(nums []int) [][]int { ret:=[][]int{} backtracking(&ret,nums,[]int{}) return ret }
|