Leetcode之全排列问题汇总
一、Leetcode 46、全排列

- 数组里面的元素互不相同,可以直接使用list.contains(nums[i])判断当前数值是否已经存在于list里面,如果没有就添加;有的话就不添加
class Solution {
List<List<Integer>>lists = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
backtracking(nums);
return lists;
}
public void backtracking(int[] nums) {
if(list.size() == nums.length) {
lists.add(new ArrayList<>(list));
return;
}
for(int i = 0; i < nums.length; i++) {
if(!list.contains(nums[i])) {
list.add(nums[i]);
backtracking(nums);
list.remove(list.size() - 1);
}
}
}
}
二、Leetcode 47、全排列II

- 数组中含有重复元素,所以要保证排列的唯一性,保证值相同的节点,不会因为颠倒了使用顺序,而组成值相同并且顺序相同的排列
- 比如nums = {1,1,2}, 会有一个排列是{2,1,1}, 就算值相同但是索引下标不同,也不可以,即不可以出现第二个{2,1,1}
class Solution {
List<List<Integer>> lists = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
int len = nums.length;
boolean[] visited = new boolean[len];
Arrays.sort(nums);
backtracking(nums, visited);
return lists;
}
public void backtracking(int[] nums, boolean[] visited) {
if(list.size() == nums.length) {
lists.add(new ArrayList<>(list));
return;
}
for(int i = 0; i < nums.length; i++) {
if(i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) {
continue;
}
if(!visited[i]) {
list.add(nums[i]);
visited[i] = true;
backtracking(nums, visited);
list.remove(list.size() - 1);
visited[i] = false;
}
}
}
}