46. Permutations
Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3] have the following permutations:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题意:
给定一组不同的数字,求出所有可能的排列,也就是求出一个数组的序列的全排列。
思路:
方法一:
这个题的主要解决办法就是递归回溯法,每递归一层,取数列中的一个元素,当满足原素组大小时,得到一个结果组合,放入结果集中,然后回溯上一层,继续下一个组合。注意点就是每次递归下一层的时候,一定要把上面已经遍历过的元素在flag标记数组中进行标记,防止下一层再选中此元素,出现重复元素,返回上一层切记清除标记数组中的标记值。
1 | class Solution { |
方法二:
递归回溯法,与方法一不同的地方是不使用标记数组,递归函数内部的for循环的起始索引是上层的index值,在循环内部进行两次swap交换操作,在递归前的交换可以得到一种递归结果,地递归后交换,可以使序列返回到 i 所在层的递归前状态,这样交转的方式,也能穷举出所有的元素排列组合。
1 | class Solution { |
方法三:
直接利用C++的STL函数库next_permutation()函数,函数详情next_permutation() 。
1 | class Solution3 { |
Java Code:
1 | class Solution { |