给定一个数字列表,返回其所有可能的排列。
样例
给出一个列表[1,2,3],其全排列为:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
一刷ac
解题思路:递归或者非递归。递归需要每次置换首位,然后递归后面的字符串,最后在递归结果中加入首位字符。非递归考虑用队列存储每次的排列,再上一次的全排列中,对每个字符串所有可能的位置插入新的字符。
class Solution {
/**
* @param nums: A list of integers.
* @return: A list of permutations.
*/
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> rst = new ArrayList<List<Integer>>();
if(nums == null) return rst;
if(nums.length == 0) {
rst.add(new ArrayList<Integer>());
return rst;
}
if(nums.length == 1){
List<Integer> res = new ArrayList<Integer>();
res.add(nums[0]);
rst.add(res);
return rst;
}
for(int i = 0; i < nums.length; i++){
int[] tmp = new int[nums.length-1];
int start = 0;
for(int j = 0; j < nums.length-1;){
if(start != i){
tmp[j] = nums[start];
start++;
j++;
}else start++;
}
List<List<Integer>> ans = permute(tmp);
for(List<Integer> item : ans)
item.add(0, nums[i]);
rst.addAll(ans);
}
return rst;
}
}
非递归
class Solution {
/**
* @param nums: A list of integers.
* @return: A list of permutations.
*/
public List<List<Integer>> permute(int[] nums) {
LinkedList<List<Integer>> rst = new LinkedList<List<Integer>>();
if(nums == null) return rst;
rst.add(new ArrayList<Integer>());
for(int num : nums){
int size = rst.size();
for(; size > 0; size--){
List<Integer> tmp = rst.pollFirst();
for(int i = 0; i <= tmp.size(); i++){
List<Integer> ans = new ArrayList<Integer>(tmp);
ans.add(i, num);
rst.add(ans);
}
}
}
return rst;
}
}