递归算法学习——全排列

递归算法学习——全排列_第1张图片

目录

​编辑

一,问题描述

1.例子:

题目接口:

 二,问题分析和解决

1.问题分析

2.解题代码


一,问题描述

首先我们得来先看看全排列的问题描述。全排列问题的问题描述如下:

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

1.例子:

递归算法学习——全排列_第2张图片

题目接口:

class Solution {
public:
    vector> permute(vector& nums) {

    }
};

 二,问题分析和解决

1.问题分析

在上面的例子中我们可以看出全排列的问题就是在给出一个数组以后,找出这个数组中的数字的不同组合。这个组合的数字个数和数组的数字个数相同。如下图,我们给出:1,2,3的例子。我们可以画出下图:

递归算法学习——全排列_第3张图片

在这个树中被红线划掉的路径就是被剪掉的路径。这个操作就叫作剪枝。在匹配完一对数据以后回到上一层树枝继续匹配的操作叫做回溯,在这棵树中的结束条件便是在将一棵树的一个路径遍历完了。 

2.解题代码

class Solution {
public:
     //全局变量:
     vector> ret;
     vectorpath;

    vector> permute(vector& nums) {
        vectorused(nums.size(),false);//标记使用过的数字。
        dfs(nums,used);
        return ret;
    }

    void dfs(vector&nums,vector&used)
    {
        if(path.size() == nums.size())//递归出口
        {
            ret.push_back(path);
            return;
        }

        for(int i = 0;i

在这段代码中,首先映入眼帘的便是两个全局变量ret和path。为什么要用全局变量呢?因为全局变量的引入可以让我们的递归函数传参变得简单,并且可以将回溯后的调整展示出来。否则,这个递归代码将会变得不好书写。

你可能感兴趣的:(算法学习——递归,学习,学习笔记,c++,深度优先,算法)