46. 全排列

46. 全排列

题目描述

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

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

分析

我们从前往后,一位一位枚举,每次选择一个没有被使用过的数。
选好之后,将该数的状态改成“已被使用”,同时将该数记录在相应位置上,然后递归。
递归返回时,不要忘记将该数的状态改成“未被使用”,并将该数从相应位置上删除。

贴出代码

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    int[] visited;

    public List<List<Integer>> permute(int[] nums) {
        if (nums.length == 0){
            return res;
        }
        visited = new int[nums.length];
        dfs(nums,new ArrayList<Integer>());
        return res;
    }

    private void dfs(int[] nums, ArrayList<Integer> path){
        if (path.size() == nums.length){
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = 0; i < nums.length; i++){
            if (visited[i] == 0){
                visited[i] = 1;
                path.add(nums[i]);
                dfs(nums,path);
                visited[i] = 0;
                path.remove(path.size() - 1);
            }
        }
    }
}

原文地址:https://www.cnblogs.com/Tu9oh0st/p/11029482.html

时间: 2024-11-08 19:59:51

46. 全排列的相关文章

LeetCode 46. 全排列(Permutations)

题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 回溯法,从第一个数开始,依次与此位置向后的每一个位置交换得到新序列,然后递归向后重复此动作,在得到某位置开头的所有序列后要把交换后的序列复原. 代码 1 class Solution { 2 public: 3 vector<vector<int>> per

[LeetCode] 46. 全排列(回溯)

题目 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题解 回溯 使用位掩码数组的方式可以模拟集合拿出放入,以处理int[] num的拿出放入

回溯算法详解[力扣46:全排列]

解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前可以做的选择. 3.结束条件:也就是到达决策树底层,无法再做选择的条件. 如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象. 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result

[Leetcode 46]全排列 Permutations 递归

[题目] Given a collection of distinct integers, return all possible permutations. 数组的组合情况. Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] [思路] 求子集,排列组合的数组题有固定模板. [代码] class Solution { public List<List<Integer>> p

[leetcode] 47. 全排列 II

47. 全排列 II 比上一个题多了个重复性 与46. 全排列完全一样的代码... class Solution { // 当没有下一个排列时return false public boolean nextPermutation(int[] nums) { if (nums.length == 1) { return false; } int p = -1; for (int i = nums.length - 2; i >= 0; i--) { if (nums[i] < nums[i +

Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)

700. 二叉搜索树中的搜索 - 树 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 思路: 二叉搜索树的特点为左比根小,右比根大.那么目标结点就有三种可能: 1. 和根一样大,那么直接返回根即可. 2. 比根的值小,那么应该再去次左子树中搜索. 3. 比根的值大,那么应该再次去右子树中搜索. 可以看到这就是一个递归的思路. class Solution: def searchBST(self

【LeetCode】下一个排列与全排列问题

(一)下一个排列 题目(Medium):31. 下一个排列 题目描述: ??实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. ??如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). ??必须原地修改,只允许使用额外常数空间. ??以下是一些例子,输入位于左侧列,其相应输出位于右侧列. ??1,2,3 → 1,3,2 ??3,2,1 → 1,2,3 ??1,1,5 → 1,5,1 解题思路: ??本题有一个比较固定的算法思路,可以总结为以下

DFS小题

原创 题目为:()()()+()()()=()()() 将1~9这9个数字填入括号,每个数字只能用一次. 枚举: 1 public class Test { 2 public static void main(String[] args){ 3 int a[]=new int[9]; 4 int flag[]=new int[10]; 5 long total=0L; 6 for(int i=1;i<=9;i++) { 7 flag[i]=0; 8 } 9 for(a[0]=1;a[0]<=9

代码题(19)— 组合与排列

1.77. 组合 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> res; vector<int>