zoukankan      html  css  js  c++  java
  • 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;
    };

     

     

     

  • 相关阅读:
    如何提高Java并行程序性能??
    《实战Java虚拟机》,最简单的JVM入门书,京东活动,满200就减100了,该出手了
    看JVM就推荐这本书
    【Java】实战Java虚拟机之五“开启JIT编译”
    实战Java虚拟机之四:提升性能,禁用System.gc() ?
    实战Java虚拟机之三“G1的新生代GC”
    实战Java虚拟机之二“虚拟机的工作模式”
    实战Java虚拟机之一“堆溢出处理”
    实战java虚拟机的学习计划图(看懂java虚拟机)
    aspose.cells 复制单元格
  • 原文地址:https://www.cnblogs.com/wltree/p/15741137.html
Copyright © 2011-2022 走看看