• 46. 全排列


    46. 全排列

    题目链接:46. 全排列(中等)

    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

    示例 1:

    输入:nums = [1,2,3]
    输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

    示例 2:

    输入:nums = [0,1]
    输出:[[0,1],[1,0]]

    示例 3:

    输入:nums = [1]
    输出:[[1]]

    提示:

    • 1 <= nums.length <= 6

    • -10 <= nums[i] <= 10

    • nums 中的所有整数 互不相同

    解题思路

    首先排列是有序的,比如 [1,2,3] 和 [2,1,3] 是两个不同的集合,而在组合里面,这两个集合是一样的。也就是说组合和排列的最大区别就是排列的有序的,集合是无序的。不过,排列中的每个元素只能使用一次,因此可以定义一个 visited 数组或哈希表来记录递归过程中被访问过的元素(注意这不是对同一层的元素进行去重(491. 递增子序列),这需要进行回溯的)。本题递归结束的条件就是 path 中的元素个数等于数组的长度。另外,需要注意,排序问题每次都需要从第一个元素开始搜索,所有 for 循环都是从 0开始的,不需要定义77. 组合 中的start

    C++

    class Solution {
    public:
        vector<int> path;
        vector<vector<int>> result;
    ​
        void backTracking(vector<int> nums, vector<bool> visited) {
            if (path.size() == nums.size()) {
                result.push_back(path);
                return;
            }
            
            // 排列问题从头开始遍历
            for (int i = 0; i < nums.size(); i++) {
                if(visited[i] == true) { // 如果该元素已经访问过,则跳过
                    continue;
                }
                path.push_back(nums[i]);
                visited[i] = true; // 标记
                backTracking(nums, visited);
                path.pop_back(); // 回溯
                visited[i] = false; // 回溯
            }
        }
    ​
        vector<vector<int>> permute(vector<int>& nums) {
            path.clear();
            result.clear();
            // 用一个数组来记录path中使用过的元素
            vector<bool> visited(nums.size(), false);
            backTracking(nums, visited);
            return result;
        }
    };

    JavaScript

    let path = [];
    let result = [];
    ​
    const backTracking = (nums, visited) => {
        if (path.length === nums.length) {
            result.push([...path]);
            return;
        }
    ​
        for (let i = 0; i < nums.length; i++) {
            if (visited[i] === true) continue;
            path.push(nums[i]);
            visited[i] = true;
            backTracking(nums, visited);
            path.pop();
            visited[i] = false;
        }
    }
    ​
    ​
    var permute = function(nums) {
        let visited = new Array(nums.length);
        visited.fill(false);
        path = [];
        result = [];
        backTracking(nums, visited);
        return result;
    };

     

     

     

  • 相关阅读:
    Socket编程中的强制关闭与优雅关闭及相关socket选项
    怎样通过MSG_WAITALL设置阻塞时间,IO模式精细讲解: MSG_DONTWAIT 、 MSG_WAITALL
    RTSP、HTTP、HTTPS、SDP四种协议详解
    RTMP、RTSP、HTTP视频协议详解(附:直播流地址、播放软件)
    Idea连接服务器docker并部署代码到docker实现一键启动
    @Autowired注解和静态方法
    关于工具类静态方法调用@Autowired注入的service类问题
    @PostConstruct
    spring-boot-starter-mail技术总结
    使用SpringBoot发送mail邮件
  • 原文地址:https://www.cnblogs.com/wltree/p/15741137.html
Copyright © 2020-2023  润新知