提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、力扣491. 递增子序列
class Solution {
private List<List<Integer>> res = new ArrayList<>();
private List<Integer> path = new ArrayList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
fun(nums, 0);
return res;
}
private void fun(int[] nums, int startIndex){
if(path.size() >= 2){
res.add(new ArrayList<>(path));
}
HashSet<Integer> h = new HashSet<>();
for(int i = startIndex; i < nums.length; i ++){
if(!path.isEmpty() && path.get(path.size() - 1) > nums[i] || h.contains(nums[i])){
continue;
}
path.add(nums[i]);
h.add(nums[i]);
fun(nums, i + 1);
path.remove(path.size() - 1);
}
}
}
二、力扣46. 全排列
class Solution {
private List<List<Integer>> res = new ArrayList<>();
private List<Integer> path = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
fun(nums, new HashSet<Integer>());
return res;
}
private void fun(int[] nums, HashSet<Integer> used){
if(path.size() == nums.length){
res.add(new ArrayList<>(path));
return ;
}
for(int i = 0; i < nums.length; i ++){
if(used.contains(nums[i])){
continue;
}
path.add(nums[i]);
used.add(nums[i]);
fun(nums, used);
path.remove(path.size() - 1);
used.remove(nums[i]);
}
}
}
三、力扣47. 全排列 II
class Solution {
private List<List<Integer>> res = new ArrayList<>();
private List<Integer> path = new ArrayList<>();
private boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
used = new boolean[nums.length];
Arrays.fill(used, false);
fun(nums);
return res;
}
private 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-1] == nums[i] && !used[i-1]){
continue;
}
if(!used[i]){
path.add(nums[i]);
used[i] = true;
fun(nums);
path.remove(path.size() - 1);
used[i] = false;
}
}
}
}
本文介绍了力扣平台上的三道算法题,包括491.递增子序列、46.全排列和47.全排列II。通过Java代码实现,展示了寻找递增子序列和数组全排列的不同方法,其中全排列II考虑了重复元素的处理。这些题目主要考察动态规划和回溯算法的应用。
881

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



