提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
对于排列问题,树层上去重和树枝上去重,都是可以的,但是树层上去重效率更高!
一、力扣90. 子集 II
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
fun(nums,0);
return res;
}
public void fun(int[] nums, int index){
res.add(new ArrayList<>(path));
for(int i = index; i < nums.length; i ++){
if(i != index && nums[i] == nums[i-1]){
continue;
}
path.add(nums[i]);
fun(nums,i+1);
path.remove(path.size()-1);
}
}
}
二、力扣491. 非递减子序列
在这里插入代码片class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
fun(nums,0);
return res;
}
public void fun(int[] nums, int index){
if(path.size() >= 2){
res.add(new ArrayList<>(path));
}
HashSet<Integer> set = new HashSet<>();
for(int i = index; i < nums.length; i ++){
if(set.contains(nums[i])){
continue;
}
if(path.size() >= 1 && nums[i] < path.get(path.size()-1)){
continue;
}
set.add(nums[i]);
path.add(nums[i]);
fun(nums,i+1);
path.remove(path.size()-1);
}
}
}
三、力扣46. 全排列
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
boolean[] flag;
public List<List<Integer>> permute(int[] nums) {
flag = new boolean[nums.length];
fun(nums);
return res;
}
public void fun(int[] nums){
if(path.size() == nums.length){
res.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < nums.length; i ++){
if(flag[i]){
continue;
}
path.add(nums[i]);
flag[i] = true;
fun(nums);
flag[i] = false;
path.remove(path.size()-1);
}
}
}
四、力扣47. 全排列 II
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
boolean[] flag;
public List<List<Integer>> permuteUnique(int[] nums) {
flag = new boolean[nums.length];
Arrays.sort(nums);
fun(nums);
return res;
}
public void fun(int[] nums){
if(path.size() == nums.length){
res.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < nums.length; i ++){
if(i > 0 && nums[i] == nums[i-1] && !flag[i-1]){
continue;
}
if(!flag[i]){
path.add(nums[i]);
flag[i] = true;
fun(nums);
flag[i] = false;
path.remove(path.size()-1);
}
}
}
}
本文详细介绍了四个LeetCode中的编程题目:90.子集II,491.非递减子序列,46.全排列,以及47.全排列II。着重讨论了使用递归和去重方法解决这些问题,包括排序、树层去重和哈希集的应用。
881

被折叠的 条评论
为什么被折叠?



