LeeCode打卡第三十五天
第一题:全排列(LeeCode第46题):
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
boolean[] used;
public List<List<Integer>> permute(int[] nums) {
if(nums.length == 0) return res;
used = new boolean[nums.length];
backtracking(nums);
return res;
}
private void backtracking(int[] nums){
if(temp.size() == nums.length){
res.add(new ArrayList<>(temp));
return;
}
for(int i = 0; i < nums.length; i++){
if(used[i]) continue;
used[i] = true;
temp.add(nums[i]);
backtracking(nums);
temp.remove(temp.size() - 1);
used[i] = false;
}
}
}
第二题:全排列II(LeeCode第47题):
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
主要思想,在上一题的基础上加了一个HashSet对结果降重
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
boolean[] used;
Set<List<Integer>> set = new HashSet<>();
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length == 0) return res;
used = new boolean[nums.length];
backtracking(nums);
res = new ArrayList<>(set);
return res;
}
private void backtracking(int[] nums){
if(temp.size() == nums.length){
set.add(new ArrayList<>(temp));
return;
}
for(int i = 0; i < nums.length; i++){
if(used[i]) continue;
used[i] = true;
temp.add(nums[i]);
backtracking(nums);
temp.remove(temp.size() - 1);
used[i] = false;
}
}
}