leetcode刷题
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
**解题思路:本题是一道地道的回溯算法!!!总结出一套回溯法的模板,供大家参考,可直接带入即可:
**无重复排列问题**
backtrack(int[] nums,List<> list,boolean[] visited){
//如果list中的元素等于了nums中的元素,说明已经找好了,直接返回就ok了
if(list.size()==nums.length){
res.add(new ArrayList<>(list));
return;
}
//模板
//1.如果已经访问了,则跳过!!!
for(int i=0;i<nums.length;i++)
if(visited){
continue;
}
//2.把visited置为true,说明已经被访问了
visited[i] = true;
//3.添加元素了
list.add(nums[i]);
//4.开始递归回溯
backtrack(nums,list,visited);
//5.删除
list.remove(list.get(list.size()-1));
//6.删除完之后要把visoted置为false
visited[i] = false;
}
**
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
List<Integer> list = new ArrayList<>();
boolean[] visited = new boolean[nums.length];
backtrack(nums,list,visited);
return res;
}
private void backtrack(int[] nums,List<Integer> list,boolean[] visited){
if(nums.length==list.size()){
res.add(new ArrayList<>(list));
}
for(int i=0;i<nums.length;i++){
if(visited[i]){
continue;
}
visited[i] = true;
list.add(nums[i]);
backtrack(nums,list,visited);
list.remove(list.get(list.size()-1));
visited[i] = false;
}
}
}