首页 > 编程语言 >回溯算法之全排列

回溯算法之全排列

时间:2023-03-06 09:11:51浏览次数:50  
标签:used nums res 之全 算法 vector 回溯 output first

leet 46 全排列

解题思路

还是全排列的板子题

Class Solution {
private:
 vector<vector<int>> result;
  vector<int> ans;
public:
  void backingtrack(...){
    if (){
      ...
      return;
    }
  for () {
    ...  
  }
  }
};

和基础不同的是,多了一个像dfs的visit数组 ,但是官方解答真的666


代码

class Solution {
private:
    vector<vector<int>> result;
    vector<int> ans;
    void backtracking(vector<int>& nums, vector<bool>& used) {
        if (ans.size() == nums.size()) {
            result.push_back(ans);
            return;
        }
        for (int i = 0 ; i < nums.size(); i++) {
            if (used[i] == false) {
                used[i] = true;
                ans.push_back(nums[i]);
                backtracking(nums,used);
                used[i] = false;
                ans.pop_back();
            }
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
            vector<bool> used(nums.size(), false);
            backtracking(nums, used);
            return result;
    }
};

官方解答

没有开辟新的数组来判断是否访问过,而是直接在原始数组中左交换,和startIndex有点类似的做法

class Solution {
public:
    void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
        // 所有数都填完了
        if (first == len) {
            res.emplace_back(output);
            return;
        }
        for (int i = first; i < len; ++i) {
            // 动态维护数组
            swap(output[i], output[first]);
            // 继续递归填下一个数
            backtrack(res, output, first + 1, len);
            // 撤销操作
            swap(output[i], output[first]);
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int> > res;
        backtrack(res, nums, 0, (int)nums.size());
        return res;
    }
};

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/permutations/solution/quan-pai-lie-by-leetcode-solution-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:used,nums,res,之全,算法,vector,回溯,output,first
From: https://www.cnblogs.com/tsqo/p/17182582.html

相关文章

  • 算法随想Day32【贪心算法】| LC435-无重叠区间、LC763-划分字母区间、LC56-合并区间
    LC435.无重叠区间贪心表现在每一步,都保证右边界尽量靠左,若两个区间出现重叠冲突,将右边界更新为两者右边界中较小的那个。如排序后,[1,5],[2,4],[4,8],[5,6],[6,7],初始右......
  • 算法时间复杂度从底到高
    O(1):常量时间,意味着算法时间并不随着数据规模而变化O(log(n)):对数时间O(n):线性时间,算法时间与数据规模成正比O(n*log(n)):拟线性时间O(n2):平方时间O(......
  • 基础算法(1)
    快速排序(O(NlogN))思路:确定分界点(序列里随机一个数都可以):左边界、右边界、中值;调整范围;递归处理左、右两段核心:每次j指针落在i指针前面位置时,将q[i]、q[j]进行swap操作(先......
  • 【基数排序算法详解】Java/Go/Python/JS/C不同语言实现
    说明基数排序(RadixSort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的......
  • 【LeetCode二叉树#18】修剪二叉搜索树(涉及重构二叉树与递归回溯)
    修剪二叉搜索树力扣题目链接(opensnewwindow)给定一个二叉搜索树,同时给定最小边界L和最大边界R。通过修剪二叉搜索树,使得所有节点的值在[L,R]中(R>=L)。你可能需......
  • 弗洛伊德算法(floyd)
    实现特点:“3个for”publicvoidfloyd(){ for(intk=0;k<vertexs.length;k++){//这个for用来取中间节点,剩下的两个for用来遍历邻接矩阵 for(inti=0;......
  • 常用数据结构和算法总结
    线性表:单链表双向链表循环链表栈队列递归字符串数组树二叉树哈夫曼树:又称为最优树,是一种带权路径长度最短的树平很二叉树B树......
  • 第2章 算法——程序的灵魂
    本文作者:FiftyOne本文链接:https://www.cnblogs.com/FiftyOne/p/17180498.html版权声明:未经作者允许严禁转载第2章 算法——程序的灵魂一个程序主要包括以下两方面的信......
  • 基于polar码和SCMA的多用户检测的联合检测译码matlab仿真,polar采用SCAN软译码,SCMA用
    1.算法描述构造的核心是通过信道极化(channelpolarization)处理,在编码侧采用方法使各个子信道呈现出不同的可靠性,当码长持续增加时,部分信道将趋向于容量近于1的完美信道(无误......
  • 手刷算法day2(1)
    104. 二叉树的最大深度 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给......