深度优先搜索(DFS)

news/2024/7/20 20:35:24 标签: 深度优先, 算法

 深度优先搜索(DFS)

基本概念

        深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者搜寻时结点不满足条件(不满足条件也被称为剪枝),搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

算法思想">算法思想

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

我这里准备了一张GIF图片,希望能够帮助你理解其中的思想

DFS可以理解为一条路走到底,不撞南墙不回头

撞南墙有两种情况

  • 遇到了边界条件(限制条件)
  • 遇到了已经走过的路

DFS的另一种结束条件,就是找到了目标出口,也就是找到了题目的答案
DFS的本质其实就是枚举

枚举+递归+回溯 = DFS

 这位博主写的十分详细,在此引出作为标记

DFS入门级(模板)_ღ江晚吟的博客-CSDN博客_dfs入门

 1,两数之和

以值为键值,下标为值创建字典

加快速度

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hashmap={};
        for i,num in enumerate(nums):
            if hashmap.get(target-num) is not None:
                return [hashmap.get(target-num),i]
            hashmap[num]=i

17. 电话号码的字母组合 DFS 相同步长的所有路径个数

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        phone={'2':['a','b','c'],
                '3':['d','e','f'],
                '4':['g','h','i'],
                '5':['j','k','l'],
                '6':['m','n','o'],
                '7':['p','q','r','s'],
                '8':['t','u','v'],
                '9':['w','x','y','z']}
        res=[]
        def dfs(s,index):
            if index==len(digits):
                res.append(s)
                return
            
            for s1 in phone[digits[index]]:
                dfs(s+s1,index+1)
        if digits:#特殊情况:digits为空时res为[''],而不是[]
            dfs('',0)
        return res

64. 最小路径和  动态规划 无初始化型

class Solution(object):
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        n=len(grid)
        m=len(grid[0])
        dp=[[float('inf')]*m for i in range(2)]

        for i in range(n):
            for j in range(m):
                if i==0 and j==0:
                    dp[i%2][j]=grid[i][j]
                elif i==0:
                    dp[i%2][j]=dp[i%2][j-1]+grid[i][j]
                elif j==0:
                    dp[i%2][j]=dp[(i-1)%2][j]+grid[i][j]
                else:
                    dp[i%2][j]=min(dp[(i-1)%2][j]+grid[i][j],dp[i%2][j-1]+grid[i][j])
        return dp[(n-1)%2][m-1]

69. x 的平方根  二分查找

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """

        up=x
        down=0
        mid=0
        if x<=1:
            return x
        while(up>down):
            mid=(up+down)//2
            sqrt=mid**2
            sqrt1=(mid+1)**2
            if sqrt>x:
                up=mid
            elif sqrt<x:
                if sqrt1>x:
                    break
                down=mid
            else:
                break
        return mid

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        righ=len(nums)-1
        left=0
        new=0

        while new<righ:
            if nums[new]==0:
                nums[new],nums[left]=nums[left],nums[new]
                left+=1
                new+=1
            elif nums[new]==1:
                new+=1
            else:
                nums[new],nums[righ]=nums[righ],nums[new]
                righ-=1
        return nums


http://www.niftyadmin.cn/n/179990.html

相关文章

ESP32设备驱动-HDC1080温度湿度传感器驱动

HDC1080温度湿度传感器驱动 文章目录 HDC1080温度湿度传感器驱动1、HDC1080介绍2、硬件准备3、软件准备4、驱动实现1、HDC1080介绍 HDC1080 是一款集成温度传感器的数字湿度传感器,可在极低功耗下提供出色的测量精度。 HDC1080 在很宽的电源范围内工作,是一种低成本、低功耗…

面向对象语言(Python)——序列之二(tuple)元组、(dict)字典、(set)集合

目录 元组 &#xff08;tuple&#xff09;元组与&#xff08;list&#xff09;列表的不同之处 创建元组 访问元组元素 修改元组、删除元组 字典 &#xff08;dict&#xff09;字典简介 创建字典 访问字典、删除字典 字典基本操作 添加键值对、修改键值对、删除键值对 判断字典中…

vulntarget-d内网靶机write-up

文章目录 网络拓扑一、thinkphp漏洞获取shell二、ubuntu提权三、代理配置+信息收集四、内网获取权限五、win7权限免责声明网络拓扑 操作系统IP地址服务描述Ubuntu 18ip1:192.168.31.81ip2: 10.10.10.132面板地址:http://ip:8888/42f5e63e/账号:hplxubsl密码:94e697b0搭建74c…

【MySQL笔记】MySQL之自定义函数和触发器的使用

这篇文章&#xff0c;主要介绍MySQL中的自定义函数和触发器的使用。 目录 一、自定义函数 1.1、创建函数 1.2、案例代码 二、触发器 2.1、创建测试表 2.2、插入触发器 2.3、更新触发器 2.4、删除触发器 2.5、字段触发器 一、自定义函数 1.1、创建函数 MySQL中自定义…

SpringBoot集成ChatGPT实现AI聊天

前言 ChatGPT已经组件放开了&#xff0c;现在都可以基于它写插件了。但是说实话我还真没想到可以用它干嘛&#xff0c;也许可以用它结合文字语音开发一个老人小孩需要的智能的说话陪伴啥的。 今天我就先分享下SpringBoot结合ChatGPT&#xff0c;先看看对话效果。 一、依…

【C语言蓝桥杯每日一题】—— 数列求值

【C语言蓝桥杯每日一题】—— 数列求值&#x1f60e;前言&#x1f64c;数列求值&#x1f64c;解题思路分析&#xff1a;&#x1f60d;非递归版解题代码&#xff1a;&#x1f60d;递归版解题代码&#xff1a;&#x1f60d;总结撒花&#x1f49e;数列求值&#x1f60e;)&#x1f…

蓝桥杯刷题第二十三天

第一题&#xff1a;长草题目描述小明有一块空地&#xff0c;他将这块空地划分为 n 行m 列的小块&#xff0c;每行和每列的长度都为 1。小明选了其中的一些小块空地&#xff0c;种上了草&#xff0c;其他小块仍然保持是空地。这些草长得很快&#xff0c;每个月&#xff0c;草都会…

Markdown基本使用

目录 Markdown是什么 Markdown特点 标题 标题1和标题2的特殊用法 自定义标题id 段落 换行 字体样式 粗体 斜体 粗斜体 删除线 列表 有序列表 无序列表 列表嵌套 任务列表 定义列表 引用 具体语法 引用多个段落 引用嵌套 引用其他元素 代码块 行内代码…