每日OJ题_DFS回溯剪枝①_力扣46. 全排列(回溯算法简介)

news2025/1/13 13:48:18

目录

回溯算法简介

力扣46. 全排列

解析代码


回溯算法简介

回溯算法是一种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。

        回溯算法的基本思想:从一个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护一个状态树,通过遍历状态树来实现对所有可能解的搜索。

        回溯算法的核心思想:“试错”,即在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索,否则,回退到上一个状态,重新做出选择。回溯算法通常用于解决具有多个解,且每个解都需要搜索才能找到的问题。

        回溯算法的模板:

void backtrack(vector<int>& path, vector<int>& choice, ...)
{
	// 满⾜结束条件
	if (/* 满⾜结束条件 */)
	{
		// 将路径添加到结果集中
		res.push_back(path);
		return;
	}
	// 遍历所有选择
	for (int i = 0; i < choices.size(); i++)
	{
		// 做出选择
		path.push_back(choices[i]);
		// 做出当前选择后继续搜索
		backtrack(path, choices);
		// 撤销选择
		path.pop_back();
	}
}

        其中, path表示当前已经做出的选择, choices表示当前可以做的选择。在回溯算法中,我们需要做出选择,然后递归地调用回溯函数。如果满足结束条件,则将当前路径添加到结果集中。

        否则,我们需要撤销选择,回到上一个状态,然后继续搜索其他的选择。回溯算法的时间复杂度通常较高,因为它需要遍历所有可能的解。但是,回溯算法的空间复杂度较低,因为它只需要维护一个状态树。在实际应用中,回溯算法通常需要通过剪枝等方法进行优化,以减少搜索的次数,从而提高算法的效率。

        回溯算法是一种非常重要的算法,可以解决许多组合问题、排列问题和搜索问题等。回溯算法的核心思想是搜索状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的模板非常简单,但是实现起来需要注意一些细节,比如何做出选择、如何撤销选择等。


力扣46. 全排列

46. 全排列

难度 中等

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

示例 1:

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

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同
class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {

};

解析代码

之前练习next_permutation时写过,代码在下面注释起来了。

 

深搜的思路是循环模仿遍历树的结点,到叶子结点就返回,不是就进入循环。

        在下面for循环里要考虑这个位置要填哪个数。根据题目要求我们肯定不能填已经填过的数,因此很容易想到的一个处理手段就是定义一个标记数组来标记已经填过的数,那么在填这个数的时候我们遍历题目给定的所有数,如果这个数没有被标记过,我们就尝试填入,并将其标记,继续尝试填下一个位置,

        回溯的时候要撤销这一个位置填的数以及标记,并继续尝试其他没被标记过的数。

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
    bool cheak[6] = {0}; // 映射下标->数字是否用过->剪枝
    
public:
    vector<vector<int>> permute(vector<int>& nums) {
        dfs(nums);
        return ret;
    }

    void dfs(vector<int> nums)
    {
        if(nums.size() == path.size())
        {
            ret.push_back(path);
            return;
        }
        for(int i = 0; i < nums.size(); ++i)
        {
            if(cheak[i] == false) // 如果没有用过才使用->剪枝
            {
                path.push_back(nums[i]);
                cheak[i] = true;
                dfs(nums); // 此时路径已经加上一个了,在让其进入递归

                path.pop_back(); // 回溯,恢复现场,(递归往回走了)
                cheak[i] = false;
            }
        }
    }
};

// class Solution {
// public:
//     vector<vector<int>> permute(vector<int>& nums) {
//         vector<vector<int>> vv;
//         sort(nums.begin(), nums.end());
//         do
//         {
//             vv.push_back(nums);
//         }while(next_permutation(nums.begin(), nums.end()));
//         return vv;
//     }
// };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1623544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UnityShader入门精要学习笔记】第十一章 Shader动画

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 UnityShad…

Vuforia AR篇(三)— AR模型出场效果

目录 前言一、AR模型出场二、AR出场特效三、添加过渡效果四、效果 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 一、AR模型出场 创建ARCamer…

上位机图像处理和嵌入式模块部署(树莓派4b之mcu固件升级)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在一个系统当中&#xff0c;可能不止需要树莓派4b一个设备&#xff0c;有的时候还需要搭载一个mcu&#xff0c;做一些运动控制的事情。比如说&…

【ESP32入门实战】初识ESP32

【ESP32入门实战】初识ESP32 文章目录 【ESP32入门实战】初识ESP32&#x1f468;‍&#x1f3eb;前言【写作缘由】&#x1f9d1;‍&#x1f393;ESP32介绍&#x1f469;‍&#x1f4bb;ESP32-WROOM-32&#x1f469;‍&#x1f4bb;ESP32的组成部分 &#x1f468;‍&#x1f3eb…

Android—统一依赖版本管理

依赖版本管理有多种方式 config.gradle 用于Groovy DSL&#xff0c;新建一个 config.gradle 文件&#xff0c;然后将项目中所有依赖写在里面&#xff0c;更新只需修改 config.gradle文件内容&#xff0c;作用于所有module buildSrc 可用于Kotlin DSL或Groovy DSL&#xff0c;…

48-70V降12V/33V 5A高效同步降压DC-DC——AH1007

AH1007是一款高效率、高压外置MOSFET管降压芯片TEL&#xff1a;186*4884*3702*&#xff0c;芯片典型输入是8V~100V,输出 电压可调&#xff0c;AH1007最大输出电流可支持6A以上&#xff0c;需要注意板子的散热和温升。 AH1007典型开关频率为150KHz。轻载时会自动降低开关频率以…

如何把MP3音频转AAC?超级简单的音频格式转换方法在这里

在数字化时代&#xff0c;音乐文件的格式多种多样&#xff0c;每种格式都有其独特的特点和优势。其中&#xff0c;MP3和AAC是两种非常常见的音频格式。MP3由于其较小的文件大小和良好的音质&#xff0c;在过去几十年中一直备受欢迎。然而&#xff0c;随着技术的进步和音频编码算…

掼蛋游戏中的坏习惯

掼蛋是一款需要团队合作和策略思考的游戏&#xff0c;已经成为很多人的日常休闲娱乐方式。然而在日常掼蛋游戏中&#xff0c;有些玩家可能会做出一些不良举动&#xff0c;影响游戏的进行。我们列举了一些常见的坏习惯&#xff0c;希望玩家能够注意并且避免。 1、随意退出 有些玩…

SpringCloud之Feign集成Ribbon

Feign定义【可跳过】 Spring Cloud Feign是一个声明式的伪Http客户端&#xff0c;它使得写Http客户端变得更简单。其英文表意为“假装&#xff0c;伪装&#xff0c;变形”&#xff0c;是一个http请求调用的轻量级框架&#xff0c;可以以Java接口注解的方式调用Http请求&#x…

Capture CIS设计小诀窍系列--Capture CIS配置-数据库搭建及ODBC配置

背景介绍&#xff1a;在原理图设计过程中&#xff0c;如果物料信息出现问题&#xff0c;导致BOM错误或者原理图符号、封装不对应&#xff0c;可能会导致项目延期甚至生产事故&#xff0c;严重影响产品设计效率。而Capture CIS原理图设计工具提供的CIS(Component Information Sy…

排队算法的matlab仿真,带GUI界面

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 M/M/1 单服务台单通道排队模型 4.2 M/M/k 多服务台排队模型 4.3 M/G/1 和 G/M/1 模型 5.完整程序 1.程序功能描述 排队算法的matlab仿真,带GUI界面。分别仿真单队列单服务台&#xff…

No system certificates available. Try installing ca-certificates.

一、错误重现 Certificate verification failed: The certificate is NOT trusted. No system certificates available. Try installing ca-certificates. 具体如图 系统环境是ubuntu:22.04 ARM架构 二、解决方法 1、先不要更换镜像源 直接设置 apt update apt -y instal…

使用 ollama 部署最新的Llama 3 70B本地模型

一、ollama是什么? 在本地启动并运行大型语言模型。运行Llama 3&#xff0c;Mistral, Gemma, Code Llama和其他模型。自定义并创建您自己的。 综合优点&#xff1a; 快速下载容器自动运行大模型&#xff0c;现在下载&#xff0c;马上上手。本地利用 cpu 运行大模型&#xff0c…

【Docker】Docker Network(网络)

文章目录 一、Docker为什么需要网络管理二、Docker网络架构简介CNMLibnetwork驱动 三、常见网络类型四、Docker网络管理命令docker network createdocker network inspectdocker network connectdocker network disconnectdocker network prunedocker network rmdocker network…

实验6 用例图

一、实验目的 1、通过绘制用例图&#xff0c;掌握其基本原理。 2、能对简单问题进行用例图分析&#xff0c;并描绘用例。 二、实验项目内容&#xff08;实验题目&#xff09; 1、用Microsoft Visio绘制下列描述文字的用例图。 “远程网络教学系统”的功能需求如下: 学生登…

腾讯清华联合打造Eurus:用偏好树推进大语言模型的推理能力大突破

目录 引言&#xff1a;推动开源大型语言模型(LLMs)在复杂推理任务中的发展 EURUS模型介绍 ULTRAINTERACT数据集的创新 EURUS在多个推理任务中的表现分析 偏好学习在推理任务中的应用和影响 EURUS-RM-7B奖励模型的评估 结论&#xff1a;EURUS系列模型的创新点和对开源推理…

kubernetes中DaemonSet控制器

一、概念 使用DaemonSet控制器&#xff0c;相当于在节点上启动了一个守护进程。通过DaemonSet控制器可以确保在每个节点上运行Pod的一个副本。如果有心的node节点加入集群&#xff0c;则DaemonSet控制器会自动给新加入的节点增加一个Pod的副本&#xff1b;反之&#xff0c;当有…

SKF 与KISSSOFT的连接

SKF 与KISSSOFT的连接 HEDZER TILLEMA&#xff0c;荷兰SKF B.V.产品线经理 最近&#xff08;2019年&#xff09;&#xff0c;瑞典滚动轴承制造商斯凯孚&#xff08;SKF&#xff09;和瑞士齿轮箱设计软件开发商KISSsoft已将斯凯孚的轴承计算服务整合到KISSsoft的软件中。借助 K…

轻松实现宅急送快递信息自动查询

在日常生活中&#xff0c;我们经常需要查询快递信息&#xff0c;而传统的查询方式往往需要我们手动输入每一个运单号&#xff0c;这种方式不仅繁琐&#xff0c;而且效率低下。那么&#xff0c;有没有一种方法可以让我们更快速、更便捷地查询快递信息呢&#xff1f;答案是肯定的…

【Python】异常、模块与包

目录 捕获异常 异常的传递 Python中的模块 模块的导入方式 as定义别名 自定义模块 Python包 第三方包 综合案例 当我们的程序遇到了BUG, 那么接下来有两种情况: ① 整个程序因为一个BUG停止运行 ② 对BUG进行提醒, 整个程序继续运行 但是在真实工作中, 我们肯定不能…