给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
package leetCode5_26;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author : caoguotao
* @date 创建时间:2019年5月28日 下午8:17:37
* @version 1.0
* @parameter
* @since
* @return
*/
public class Solution46 {
public static void main(String[] args) {
Solution46 s = new Solution46();
int[] nums = {1,0,-1};
List<List<Integer>> lists = s.permute(nums);
for (List<Integer> list2 : lists) {
for (Integer integer : list2) {
System.out.print(integer + " ");
}
System.out.println();
}
}
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if(nums.length == 0) {
return list;
}
List<Integer> temp = new ArrayList<Integer>();
DFS(list, nums, temp);
return list;
}
//遍历数据
private void DFS(List<List<Integer>> list, int[] nums, List<Integer> temp) {
if(temp.size() == nums.length) {
//判断是否重复引用了同一个数据
boolean flag = check(temp);
if(flag) {
list.add(temp);
}
return;
}
for(int i = 0; i < nums.length; i++) {
List<Integer> l = new ArrayList<Integer>(temp);
l.add(nums[i]);
DFS(list, nums, l);
}
}
public boolean check(List<Integer> temp) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0; i < temp.size(); i++) {
if(map.get(temp.get(i)) == null) {
//第一次访问到就赋值为1
map.put(temp.get(i), 1);
}else {
return false;
}
}
return true;
}
}