美文网首页
算法|递增子序列、全排列、全排列 II

算法|递增子序列、全排列、全排列 II

作者: 激扬飞雪 | 来源:发表于2022-12-13 18:25 被阅读0次

一、 491. 递增子序列

题目链接:https://leetcode.cn/problems/increasing-subsequences/

class Solution {
    private List<Integer> paths;
    private List<List<Integer>> result;
    private void backTracking(int[] nums, int startIndex) {
        if (paths.size() > 1) {
            result.add(new ArrayList<>(paths));
        }
        HashSet<Integer> hashSet = new HashSet<>();
        for (int i = startIndex; i < nums.length; i++){
            //递增判断
            if (!paths.isEmpty() && nums[i] < paths.get(paths.size() - 1)) continue;
            //树层去重
            if (hashSet.contains(nums[i])) continue;
            hashSet.add(nums[i]);
            paths.add(nums[i]);
            backTracking(nums, i + 1);
            paths.remove(paths.size() - 1);
        }
    }
    public List<List<Integer>> findSubsequences(int[] nums) {
        paths = new ArrayList<>();
        result = new ArrayList<>();
        backTracking(nums, 0);
        return result;
    }
}

二、 46. 全排列

题目链接:https://leetcode.cn/problems/permutations/

class Solution {
    private List<Integer> paths;
    private List<List<Integer>> result;
    private void backTracking(int[] nums, boolean[] uses) {
        if (paths.size() == nums.length) {
            result.add(new ArrayList<>(paths));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (uses[i]) continue;
            paths.add(nums[i]);
            uses[i] = true;
            backTracking(nums, uses);
            uses[i] = false;
            paths.remove(paths.size() - 1);
        }
    }
    public List<List<Integer>> permute(int[] nums) {
        paths = new ArrayList<>();
        result = new ArrayList<>();
        boolean[] uses = new boolean[nums.length];
        Arrays.fill(uses, false);
        backTracking(nums, uses);
        return result;
    }
}

三、 47. 全排列 II

题目链接:https://leetcode.cn/problems/permutations-ii/

class Solution {
    private List<Integer> paths;
    private List<List<Integer>> result;
    private void backTracking(int[] nums, boolean[] uses) {
        if (paths.size() == nums.length) {
            result.add(new ArrayList<>(paths));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (uses[i]) continue;
            if (i > 0 && nums[i] == nums[i - 1] && !uses[i - 1]) continue;
            paths.add(nums[i]);
            uses[i] = true;
            backTracking(nums, uses);
            uses[i] = false;
            paths.remove(paths.size() - 1);
        }

    }
    public List<List<Integer>> permuteUnique(int[] nums) {
        paths = new ArrayList<>();
        result = new ArrayList<>();
        Arrays.sort(nums);
        boolean[] uses = new boolean[nums.length];
        Arrays.fill(uses, false);
        backTracking(nums, uses);
        return result;
    }
}

相关文章

  • 排列,组合,子集专题

    排列组合的题用回溯法和递归基本可以解决,总结一下。46.全排列 47.全排列II 47比46多了个序列可重复的条件...

  • LeetCode 第 47 题:全排列 II

    传送门:47. 全排列 II。 给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]...

  • 排列类算法问题大总结

    全排列 带重复元素的排列 下一个排列 上一个排列 第 k 个排列 排列序号 排列序号II 全排列 给定一个数字列表...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 算法题--全排列II

    0. 链接 题目链接 1. 题目 Given a collection of numbers that might...

  • 全排列 II

    给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 输入: [1,1,2]输出:[[1,1,2],[1...

  • 46. Permutations

    算法 1: 递归数组 的全排列,等价于全排列与可能的取值组合得到。 算法 2: 计算一个排列 按字典升序排列的紧...

  • 47. 全排列 II

    47. 全排列 II[https://leetcode.cn/problems/permutations-ii/]...

  • YC-常考的题目

    46. 全排列 47. 全排列 II 有条件的全排列,打印出[1,2,2,3,4,5]的所有4不在头并且3和5不挨...

  • 全排列(无重复序列)

    题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例: 这是一个全排列组合的算法!因为题目已经告诉我...

网友评论

      本文标题:算法|递增子序列、全排列、全排列 II

      本文链接:https://www.haomeiwen.com/subject/leghqdtx.html