回溯算法 DFS

目录

  • 回溯算法和dfs的区别
  • 回溯算法
    • 基本框架
    • 例题:【1,2,3】的全排列
    • 代码详解
    • 完整代码
  • DFS

本文思路、代码均参考于:https://labuladong.online/algo/essential-technique/backtrack-framework-2/#%E4%B8%80%E3%80%81%E5%85%A8%E6%8E%92%E5%88%97%E9%97%AE%E9%A2%98

回溯算法和dfs的区别

回溯算法和dfs算法极为相似,本质上就是一种暴力穷举算法。
区别就是:回溯算法是在遍历【树枝】,dfs算法是在遍历【节点】

回溯算法

基本框架

result = []
def backtrack(路径,选择列表):
	if 满足结束条件:
		result.add(路径)
		return

	for 选择 in 选择列表:
		做选择
		backtrack(路径,选择列表)
		撤销选择

例题:【1,2,3】的全排列

  • 如图,1,2,3的全排列我们可以用一个树来表示(回溯算法是记录路径!!)

在这里插入图片描述

  • 大致思想是这样的(先拿出来一支杈 分析分析)
    在这里插入图片描述
  • 站在一个回溯树的节点上,只需要思考3个问题:
    1.路径:也就是已经做出的选择
    2.选择列表:也就是当前可以做的选择
    3.结束条件:到达决策树底层,无法再做选择的条件
  • 只针对上面有色儿的那一支杈

      - 对于上面的“粉色”节点:
      	路径:没有
      	选择列表:【1】
      	结束条件:遍历到叶子节点
      - 对于上面的“黄色”节点:
      	路径:【1】
      	选择列表:【2,3】
      	结束条件:遍历到叶子节点
      - “红色”:
      	路径:【1,2,3】
      	选择列表:没有
      	结束条件:到达结束条件
    

代码详解

  • 基本思想完事了,我们来仔细分析下代码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

完整代码

import java.util.LinkedList;
import java.util.List;

//import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;

public class Main{
	static LinkedList<List<Integer>> list = new LinkedList<>();

	public static void main(String[] args) {
		int[] nums = {1,2,3};
		System.out.println(permute(nums));
	}
	
	//输入一组不重复的数字,返回他们的全排列
	static List<List<Integer>> permute(int[] nums){
		//记录[路径]
		LinkedList<Integer> track = new LinkedList<>();
		// [路径] 中的元素会被标记为true,避免重复使用
		boolean[] used = new boolean[nums.length];
		
		backtrack(nums,track,used);
		return list;
	}

	// 路径:记录在track中
	//选择列表:nums中不存在于track的那些元素(used[i] 为false)
	//结束条件:nums中的元素全都在track中出现
	static void backtrack(int[] nums, LinkedList<Integer> track, boolean[] used) {
		//结束条件
		if(track.size() == nums.length) {
			list.add(new LinkedList(track));
			return;	//返回上一级backtrack
		}
		
		for(int i=0;i<nums.length;i++) {
			//排除不合法的选择
			if(used[i]) {
				//nums[i]已经在track中,跳过
				continue;
			}
			
			//做选择
			track.add(nums[i]);
			used[i] = true;
			//进入下一层决策树
			backtrack(nums, track, used);
			//取消选择
			track.removeLast();
			used[i] = false;
		}
		
		//return;	//返回上一级的backtrack(不加也行,循环结束,自动返回上一级backtrack)
		
	}
}

DFS

我在读这篇<回溯算法>的文章时 , 本以为他会讲回溯算法和dfs的区别 但是,文章后面说----其实回溯算法就是dfs…(无语啊啊啊啊)

  • 总的来说,几乎没有区别
  • 下面这个是我之前学过的一个dfs全排列的代码,一起来对比一下吧
    详情看这篇文章,也算是看一看另一种理解方式吧
    //也是[1,2,3]的全排列
import java.util.Scanner;

public class Main {

    static int n;
    static int[] a;
    static boolean book[];

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        a=new int[n+2];
        book=new boolean[n+2];
        dfs(1);
        scanner.close();
    }
    public static void dfs(int k) {
        // 回头条件
        if(k==n+1){ //说明n个盒子都已经放完了
            for(int i=1;i<=n;i++){
                System.out.print(a[i]+" ");
            }
            System.out.println();
            return; //这里的return是返回上一级dfs(可以理解为,方案一执行完了,还要进行方案二的排序)
        }

        // 放牌等操作
        for(int i=1;i<=n;i++){   //进行1~n号牌的排序
            if(book[i]==false){ //当这个盒子里没有牌时,可以进行以下操作
                a[k]=i;         //i号牌放入k号盒子中
                book[i]=true;   //标记盒子不为空
                dfs(k+1);       //带着手中的牌,走向下一个盒子
                book[i]=false;  //箱子置空。其实每次循环都执行到dfs(k++),只有当执行到没有路可走的时候,才会"回头";也就相当于例子中的,要从3号箱开始往回一个个收牌了
            }
        }
        return;

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数字图像处理】图像的最近邻插值、双线性插值和双三次插值

图像最近邻插值、双线性插值和双三次插值 用 O ( X , Y ) O(X,Y) O(X,Y)表示 H W H\times W HW的原始图像&#xff0c; G ( X ^ , Y ^ ) G(\hat{X},\hat{Y}) G(X^,Y^)表示 H ^ Y ^ \hat{H}\times\hat{Y} H^Y^的目标图像。 最近邻插值 最近邻插值法令目标图像在 ( x ^ , y…

深入理解直播美颜SDK背后的深度学习原理

直播美颜SDK技术背后涉及了深度学习原理的应用&#xff0c;今天我将为大家讲解美颜SDK其中的深度学习算法&#xff0c;还有一些基本原理与关键技术。 一、深度学习在直播美颜中的应用 直播美颜SDK的核心是基于深度学习的算法模型。这些模型通常由多个卷积神经网络组成&#xf…

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

VS2022配置boost库-Windows为例

1. boost库下载 1&#xff09;下载boost库源码&#xff1a;https://www.boost.org/ 2&#xff09;以1.81版本为例&#xff0c;安装包如下 3&#xff09;下载后解压 比如我是放在E盘下面的boost文件夹 2. 安装配置 1&#xff09;打开VS2022命令行 2&#xff09;切换安装…

智慧城市治理:构建全域覆盖的城市时空感知体系

TSINGSEE青犀AI算法中台是一款平台型产品&#xff0c;专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点&#xff0c;可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术&#xff0c;包括视频编解码技术、嵌入式…

蓝桥杯刷题-04-岛屿个数-DFS

#include <iostream> #include<bits/stdc.h> #define int long long using namespace std; const int N2e510; typedef pair<int,int>pii;map<pii, int>st;//记录从{x&#xff0c;y}的距离是多少 int a[N];//存储原始路径vector<pii>edge[N];//存…

C语言 | Leetcode C语言题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; char * convert(char * s, int numRows){int n strlen(s), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;char * ans (char *)malloc(sizeof(char) * (n 1));int pos 0;for (int i 0; i < r; i) { // 枚举矩阵的…

回溯算法|46.全排列

力扣题目链接 class Solution { public:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() nums.size()) {result.push_back(path);re…

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…

做好产品定位的3个重点

产品定位对于项目而言至关重要&#xff0c;正确的产品定位有助于项目锁定目标市场&#xff0c;精准满足客户需求。通过差异化产品策略&#xff0c;让产品在众多竞品中脱颖而出&#xff0c;形成独特竞争优势&#xff0c;从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…

【智能算法】猎豹优化器(CO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;MA Akbari等人受到自然界中猎豹捕猎行为启发&#xff0c;提出了猎豹优化器&#xff08;The Cheetah Optimizer&#xff0c;CO&#xff09;。 2.算法原理 2.1算法思想 CO法对猎…

软件测试学习(一)

1.软件测试的定义 软件是控制计算机硬件工作的工具。 软件基本组成&#xff1a;客服端、服务器、数据库 软件产生过程&#xff1a;需求产生->需求文档->设计效果图->产品开发->产品测试->部署上线 软件测试的定义&#xff1a;使用技术手段来验证软件产品是否…

Java编程使用CGLIB动态代理介绍与实战演示

文章目录 前言技术积累核心概念主要功能适用场景与JDK动态代理的对比 实战演示定义待代理的目标类实现MethodInterceptor接口使用代理对象 测试结果写在最后 前言 在Java编程中&#xff0c;CGLIB (Code Generation Library) 是一个强大的高性能代码生成库&#xff0c;它通过生…

5.Python数据分析—Pandas数据结构详讲

5.Python数据分析—Pandas数据结构详讲 摘要个人简介简介Series定义和特点创建方法属性和方法 DataFrame定义和特点创建方法数据获取和操作 索引对象种类和应用作用和管理 摘要 Pandas是一个开源的Python数据分析库&#xff0c;提供了高性能、易用的数据结构和数据分析工具。它…

向量数据库实战介绍

本文将介绍三种常用的向量数据库&#xff1a;faiss, Milvus和Qdrant&#xff0c;并给出一个具体的使用例子。 向量数据库&#xff08;Vector Database&#xff09;是一种专门用于存储、管理、查询、检索向量的数据库&#xff0c;主要应用于人工智能、机器学习、数据挖掘等领域。…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)

继续上篇博文&#xff1a;STM32学习和实践笔记&#xff08;4&#xff09;: 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-CSDN博客 往下写&#xff0c; 为什么&#xff1a;当GPIO_InitStructure.GPIO_PinGPIO_Pin_0 ; 时&#xff0c;其实就是将对应的该引脚的寄存器地…

如何处理Flutter内存泄漏检测和优化

处理Flutter内存泄漏问题是构建高性能、稳定的应用程序的关键部分之一。在本文中&#xff0c;我将详细介绍如何检测和优化Flutter内存泄漏问题&#xff0c;以确保应用程序的良好性能和用户体验。 1. 了解内存泄漏 在深入了解如何处理Flutter内存泄漏之前&#xff0c;首先需要了…

基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; 管理员信息属性 &#x1f4ac; 学生信息实体属性 &#x1f4ac; 宿舍安排信息实体属性 &#x1f4ac; 卫生检查信息实体属性 &…

LeetCode 第391场周赛个人题解

目录 哈沙德数 原题链接 思路分析 AC代码 换水问题 II 原题链接 思路分析 AC代码 交替子数组计数 原题链接 思路分析 AC代码 最小化曼哈顿距离 原题链接 思路分析 AC代码 哈沙德数 原题链接 思路分析 签到题&#xff0c;不说了 AC代码 class Solution:def s…

实时获取 Pacific Time Zone (太平洋时区) 时间

实时获取 Pacific Time Zone [太平洋时区] 时间 1. Google -> Pacific Time2. Pacific Time - exact time nowReferences 1. Google -> Pacific Time 2. Pacific Time - exact time now https://time.is/zh/PT References [1] Yongqiang Cheng, https://yongqiang.blog…