6.3Permutations -- 回溯法--力扣101算法题解笔记

6.3Permutations -- 回溯法

回溯法概念了解

回溯法,是优先搜索的一种特殊情况,又称为试探法,常用于需要记录节点状态的深度优先搜索。通常来说,排列、组合、选择类问题使用回溯法比较合适

他的核心就是------"回溯 "。具体来说,**在搜索到一个节点的时候,发现这个节点并不是需求目标时,我们回退到原来的节点进行收缩,并把在目前节点进行操作的部分还原。**这样的好处就是,我们始终只对图的总状态进行修改,而非每次遍历时候都新建一个图来存状态。

记住两个关键:一是按照引用传状态,二是所有的状态修改在递归完成后悔改。

一般有两种情况,一是修改最后一位输出,比如排列组合,一种是修改访问标记,比如矩阵里的搜索字符串。

题目描述

给定一个无重复数字的整数数组,求其所有的排列方式

输入输出样例

Input :1,2,3

Output:\[1,2,3,1,3,2,2,1,3,3,2,1,3,1,2]

注:可以按任意顺序输出,只要包含了所有排列方式就行。

题解

这个是不是听起来挺简单的,可以直接更改遍历顺序给他遍历出来所有情况就行。那问题是是用什么方法来进行遍历,能达到所有的排列情况都出现。

回溯法这种:先对原数组修改再回溯后,把原数组变回来,接着再改变位置。

cpp 复制代码
#include <vector>
#include <iostream>
using namespace std;

void backtracking(vector<int>& nums, int level, vector<vector<int>>& ans) {
    //如果递归的修改节点都改好了,进入if,递归终止
    if (level == nums.size() - 1) {
        ans.push_back(nums);
        return;
    }
    // 遍历:从当前level位置开始,尝试将每个数固定在level位置
    // i从level开始,避免重复交换(比如level=0时,i=0/1/2分别对应固定第0位为1/2/3)
    for (int i = level; i < nums.size(); ++i) {
        //修改当前节点状态
        swap(nums[i], nums[level]);   
        //递归子节点,处理下一层
        backtracking(nums, level + 1, ans); 
        //把交换的数换回来,恢复数组原始状态,让下一次循环能尝试固定其他数在level位置
        swap(nums[i], nums[level]);             
    }
}

vector<vector<int>> permute(vector<int>& nums) {
    vector<vector<int>>ans;
    backtracking(nums, 0, ans);
    return ans;
}

int main() {
        vector<int> nums = { 1,2,3 };
        vector<vector<int>> res = permute(nums);

        cout << "[";
        for (int i = 0; i < res.size(); ++i) {
            if (i > 0) cout << ", ";
            cout << "[" << res[i][0] << ", " 
                        << res[i][1] << ", " 
                        << res[i][2] << "]";
        }
        cout << "]" << endl;

        return 0;
}
相关推荐
Seraphina368 小时前
记一次实验:利用路径分隔符进行网页缓存欺骗
经验分享·笔记·安全·网络安全·缓存
AOwhisky8 小时前
Linux 网络服务架设学习笔记(第五期)——Web 服务(上篇):Apache HTTP Server——从静态到动态
linux·运维·服务器·笔记·学习·云计算·apache
船厂电气自动化ai大模型8 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习
人工智能培训9 小时前
人工智能数据安全下的个人信息保护实践方案
大数据·人工智能·算法·生活
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端
元启数宇10 小时前
幕墙AI设计算法逻辑:元启数宇如何智能分格
人工智能·算法
宵时待雨10 小时前
优选算法专题16:多源BFS
算法·宽度优先
重生之后端学习10 小时前
53. 最大子数组和[中等]✅
java·数据结构·算法·leetcode·职场和发展
INGNIGHT10 小时前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
lucas_AI11 小时前
把表格压成 64 个 token,长文档问答反而更准了:先找表,再看数
人工智能·深度学习·算法