题目
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
解题思路—回溯法:全排列问题是回溯法的经典应用,核心思想就是先固定一段序列的第一个数字,再将后续的数字依次交换。这一过程可以使用递归使用,要注意的是,每次将数字交换完毕后,要还原交换的顺序,避免对下一次交换顺序产生影响。
Java解题—回溯法
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new LinkedList<>();
if(nums==null || nums.length==0)
return list;
ArrayList<Integer> arr = new ArrayList<>();
for(int i:nums)
arr.add(i);
backTrack(nums.length, arr, list, 0);
return list;
}
// 回溯法
public void backTrack(int len, ArrayList<Integer> arr, List<List<Integer>> list, int index){
if(index==len)
list.add(new ArrayList<Integer>(arr));
for(int i=index;i<len;i++){
Collections.swap(arr, index, i);
backTrack(len, arr, list, index+1);
Collections.swap(arr, index, i); // 回溯还原
}
}
}