15. 全排列
给定一个数字列表,返回其所有可能的排列。
样例
样例 1:
输入:[1]
输出:
[
[1]
]
样例 2:
输入:[1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
挑战
使用递归和非递归分别解决。
注意事项
你可以假设没有重复数字。
public class Solution {
/*
* @param nums: A list of integers.
* @return: A list of permutations.
*/
public List<List<Integer>> permute(int[] nums) {
// write your code here
arrange(nums, 0, nums.length - 1);
return ret;
}
List<List<Integer>> ret=new ArrayList<>();
void arrange(int a[], int start, int end) {
if (start >= end) {
List<Integer> lists=new ArrayList<>();
for (int j=0 ;j<a.length;j++){
lists.add(a[j]);
}
ret.add(lists);
return;
}
for (int i = start; i <= end; i ++) {
swap(a, i, start); //循环一轮,确保每个元素都能当一次第一元素
arrange(a, start+1, end);//核心思想就是,第一个元素的全排列等于,它加上余下数字的全排列
swap(a, i, start); //完成一次递归后,还完数组,保证不会出现乱序
}
}
void swap(int arr[], int i, int j) {
int te = arr[i];
arr[i] = arr[j];
arr[j] = te;
}
}