回溯算法----全排列

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

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]解答(C++):
class Solution {
public:
    vector<vector<int>> vec;
    void backTrace(vector<int> nums, int pos) {
        if (pos == nums.size()) {
            vec.push_back(nums);
            return;
        }

        for (int i = pos; i < nums.size(); ++i) {
            std::swap(nums[pos], nums[i]);
            backTrace(nums, pos+1);
            std::swap(nums[i], nums[pos]);
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        backTrace(nums, 0);
        return vec;
    }
};

原文地址:https://www.cnblogs.com/vczf/p/12603258.html

时间: 2024-10-28 10:26:07

回溯算法----全排列的相关文章

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

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

LeetCode46 回溯算法求全排列,这次是真全排列

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写过.今天的LeetCode46题正是让我们生成给定元素的全排列. 题意很简单,只有一句话,给定一个没有重复元素的序列,让我们返回这个序列所有的全排列,并且我们不需要考虑这些排列的顺序. 回溯法 我们在之前的文章当中分析过,全排列问题,可以看成是搜索问题,从而近似成八皇后问题.在八皇后问题当中,我们枚

回溯算法题总结

今天笔试了华为的提前批,爆炸,三道题最后就拿了200分,各种输入输出问题...醉了啊,题都不是很难,但输入输出折腾了半天T  T...第三题是和尚挑水的问题, 一.问题某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:和尚1: 星期二,四;和尚2: 星期一,六;和尚3: 星期三,日;和尚4: 星期五;和尚5: 星期一,四,六;和尚6: 星期二,五;和尚7: 星期三,六,日;请将所有合理的挑水时间安排表 其实思路很简单,就是使用回溯算法,但是我自己太坑了啊,当时看到八皇

穷举递归和回溯算法终结篇

穷举递归和回溯算法 在一般的递归函数中,如二分查找.反转文件等,在每个决策点只需要调用一个递归(比如在二分查找,在每个节点我们只需要选择递归左子树或者右子树),在这样的递归调用中,递归调用形成了一个线性结构,而算法的性能取决于调用函数的栈深度.比如对于反转文件,调用栈的深度等于文件的大小:再比如二分查找,递归深度为O(nlogn),这两类递归调用都非常高效. 现在考虑子集问题或者全排列问题,在每一个决策点我们不在只是选择一个分支进行递归调用,而是要尝试所有的分支进行递归调用.在每一个决策点有多种

谈谈递归和回溯算法的运用

递归和回溯算法的运用 题目描述 有n个士兵站成一列,从第1个士兵前面向后望去,刚好能看到m个士兵,如果站在后面的士兵身高小于或者等于前面某个士兵的身高,那么后面的这个士兵就不能被看到,问这n个士兵有多少种排列方式,刚好在观测位能看到m个士兵? 第一行输入 n 个士兵和 m 个可以看到的士兵(n >= m),第二行输入 n 个士兵的身高,输出为排列方式的种数. 输入: 4 3 1 1 2 3 输出: 6 也就是说,输入数 n, m (n < m),然后输入 n 个正整数到一个数组 a 中,a 数

排列组合和回溯算法-面试题

排列组合 排列组合通常用于在字符串或序列的排列和组合中,其特点是固定的解法和统一的代码风格.通常有两种方法:第一种是类似动态规划的分期摊还的方式,即保存中间结果,依次附上新元素,产生新的中间结果:第二种是递归法,通常是在递归函数里,使用for循环,遍历所有排列或组合的可能,然后在for循环语句内调用递归函数. 回溯 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来 ,换一条路再试.用回溯算法解决问题的一般步骤为: 1.定义一个解

回溯算法详解(转)

https://leetcode-cn.com/problems/n-queens/solution/hui-su-suan-fa-xiang-jie-by-labuladong/ 这篇文章是很久之前的一篇<回溯算法详解>的进阶版,之前那篇不够清楚,就不必看了,看这篇就行.把框架给你讲清楚,你会发现回溯算法问题都是一个套路. 废话不多说,直接上回溯算法框架.解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前

五大算法之回溯算法

回溯算法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 回溯法解决的问题可以用树结构来描述,每个状态下都对应有n种选择.以全排列问题为例,如对[1, 2, 3]进行全排列,每次从1, 2, 3中选择了一个值后,下一次又可以从1, 2, 3中选择一个值,将这个过程绘制成一棵树,每个节点都有1, 2, 3三个子节点.通常对树的遍历为

回溯算法学习

解决一个回溯问题,实际上就是一个决策树的遍历过程.思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前可以做的选择. 3.结束条件:也就是到达决策树底层,无法再做选择的条件. 回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择 其核心就是 for 循环里面的递归,在递归调用之